#!/usr/bin/env bash
#
# Store-Screenshots über den Demo-Login aufnehmen.
#
# Fährt den integration_test-Screenshot-Lauf (integration_test/screenshot_test.dart)
# über flutter drive für die drei von Google Play verlangten Formfaktoren durch
# (Phone + 7″ + 10″ Tablet sind inzwischen Pflicht). Statt drei AVDs zu verwalten,
# wird EIN laufendes Gerät/Emulator pro Durchlauf per `adb shell wm size/density`
# auf die Zielauflösung gebracht; takeScreenshot liefert dann Frames in genau
# dieser Pixelgröße.
#
# Ablage:
#   - kanonisch (versioniert): materials/screenshots/android/<formfaktor>/
#   - Kopie für den Upload:     android/fastlane/metadata/android/de-DE/images/<...>Screenshots/
# Danach: `cd android && fastlane upload_screenshots`.
#
# Voraussetzungen:
#   - genau ein per `adb devices` sichtbares Gerät/Emulator (>= Android 8)
#   - flutter, adb im PATH
#
# Aufruf (vom Client-Projektwurzelverzeichnis):
#   tool/screenshots.sh                    # debug-Build (schnell)
#   BUILD_MODE=profile tool/screenshots.sh
#   PROFILES="phone" tool/screenshots.sh   # nur eine Größe

set -euo pipefail

cd "$(dirname "$0")/.."

BUILD_MODE="${BUILD_MODE:-debug}"
MATERIALS_BASE="materials/screenshots/android"
FASTLANE_BASE="android/fastlane/metadata/android/de-DE/images"
APP_ID="eu.mhsl.marianum.mobile.client"

# name | breite x höhe (px) | dichte (dpi) | materials-Ordner | fastlane-Ordner
# Phone nutzt die NATIVE Displayauflösung des Geräts (voller Hochformat, nicht
# auf 16:9 gestaucht). Tablets im QUERFORMAT (Breite > Höhe); bei den
# Landscape-Breiten (>1000dp) zeigt Talk zudem die Master-Detail-Splitview.
# Dichten so gewählt, dass die adaptive Bottom-Bar die passende Tab-Anzahl zeigt.
declare -A PROFILE_SIZE=(
  [phone]="native"      [seven]="1920x1200"      [ten]="2560x1600"
)
declare -A PROFILE_DENSITY=(
  [phone]="native"      [seven]="240"            [ten]="280"
)
declare -A PROFILE_MATERIALS=(
  [phone]="phone"       [seven]="7-inch"         [ten]="10-inch"
)
declare -A PROFILE_FASTLANE=(
  [phone]="phoneScreenshots"
  [seven]="sevenInchScreenshots"
  [ten]="tenInchScreenshots"
)

PROFILES="${PROFILES:-phone seven ten}"

# App-APK einmal vorab bauen, damit sie vor jedem `flutter drive` installiert
# und die Notification-Permission gegrantet werden kann (drive deinstalliert die
# App nach jedem Lauf, sonst wäre der Grant weg und ein Systemdialog könnte die
# Screenshots verdecken). Der eigentliche drive-Lauf reinstalliert sie per -r.
APK="build/app/outputs/flutter-apk/app-${BUILD_MODE}.apk"
echo "Baue App-APK ($BUILD_MODE) vorab…"
flutter build apk "--$BUILD_MODE"

reset_display() {
  echo "Setze Displaygröße/-dichte zurück…"
  adb shell wm size reset || true
  adb shell wm density reset || true
}
trap reset_display EXIT

for profile in $PROFILES; do
  size="${PROFILE_SIZE[$profile]}"
  density="${PROFILE_DENSITY[$profile]}"
  materials_dir="$MATERIALS_BASE/${PROFILE_MATERIALS[$profile]}"
  fastlane_dir="$FASTLANE_BASE/${PROFILE_FASTLANE[$profile]}"

  echo ""
  echo "=== Profil '$profile'  ($size @ ${density}dpi)  ->  $materials_dir ==="
  mkdir -p "$materials_dir" "$fastlane_dir"
  rm -f "$materials_dir"/*.png "$fastlane_dir"/*.png

  # "native" -> Geräteauflösung/-dichte verwenden (für Phone), sonst erzwingen.
  if [ "$size" = "native" ]; then
    adb shell wm size reset
    adb shell wm density reset
  else
    adb shell wm size "$size"
    adb shell wm density "$density"
  fi

  # App sicherstellen, frische (ausgeloggte) Session erzwingen und
  # Notification-Permission erteilen, bevor drive läuft. pm clear setzt auch die
  # Runtime-Permissions zurück, daher der Grant DANACH.
  [ -f "$APK" ] && adb install -r "$APK" >/dev/null 2>&1 || true
  adb shell pm clear "$APP_ID" >/dev/null 2>&1 || true
  adb shell pm grant "$APP_ID" android.permission.POST_NOTIFICATIONS 2>/dev/null || true
  sleep 2

  SCREENSHOT_OUT_DIR="$materials_dir" flutter drive \
    --driver=test_driver/integration_test.dart \
    --target=integration_test/screenshot_test.dart \
    --"$BUILD_MODE" \
    --no-dds

  # Kanonische Bilder in den Fastlane-Upload-Ordner spiegeln.
  cp "$materials_dir"/*.png "$fastlane_dir"/
  echo "Profil '$profile' fertig: $(ls -1 "$materials_dir"/*.png 2>/dev/null | wc -l) Screenshots"
done

reset_display
trap - EXIT

echo ""
echo "Kanonische Screenshots: $MATERIALS_BASE/{phone,7-inch,10-inch}/"
echo "Upload: cd android && fastlane upload_screenshots"
