#!/bin/bash
# Ein-Datei-Installer für den gdrive://-Link-Handler.
#
# Ausführen mit:
#   bash install.sh
#
# Baut die "GDrive öffnen.app" komplett neu, macht sie zum Handler für
# gdrive://-Links und prüft am Ende, ob die Registrierung geklappt hat.
# Enthält alles in einer Datei (keine weiteren Dateien nötig) — kann per
# Slack/E-Mail/AirDrop verschickt und einfach ausgeführt werden.

set -euo pipefail

APP_NAME="GDrive öffnen"
APP="/Applications/$APP_NAME.app"
BUNDLE_ID="io.agencyflow.gdrivehandler"
LSREGISTER="/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister"

echo "Google-Drive-Link-Öffner wird installiert ..."
echo ""

# 0. Voraussetzung prüfen: Google Drive for Desktop muss installiert und
#    eingeloggt sein, sonst gibt es lokal nichts zu öffnen.
if ! ls -d "$HOME/Library/CloudStorage/GoogleDrive-"* >/dev/null 2>&1; then
  echo "⚠️  Google Drive for Desktop wurde nicht gefunden."
  echo "    Bitte zuerst Google Drive for Desktop installieren und mit dem"
  echo "    AGENCYFLOW-Konto einloggen, dann dieses Skript erneut ausführen."
  exit 1
fi

# 1. Minimale AppleScript-App bauen, die auf "open location" reagiert
echo "1/5  App wird gebaut ..."
TMP_AS=$(mktemp -t gdrive-handler).applescript
cat > "$TMP_AS" <<'APPLESCRIPT_EOF'
on open location theURL
	set appPath to POSIX path of (path to me)
	set scriptPath to appPath & "Contents/Resources/open-in-drive.sh"
	do shell script quoted form of scriptPath & " " & quoted form of theURL
end open location
APPLESCRIPT_EOF

rm -rf "$APP"
osacompile -o "$APP" "$TMP_AS"
rm -f "$TMP_AS"

# 2. Öffnungs-Logik in die App einbetten (macht sie in sich geschlossen)
echo "2/5  Öffnungs-Logik wird eingebettet ..."
cat > "$APP/Contents/Resources/open-in-drive.sh" <<'GDRIVE_RESOLVER_SCRIPT_EOF'
#!/bin/bash
# Öffnet einen Google-Drive-Ordner lokal in Finder, ausgehend von einer
# gdrive://-URL. Unterstützt zwei Formate:
#
#   1. Drive-Item-ID (empfohlen):        gdrive://1nPNjASa1uJTt6UR2wTa3VZ4SYd-MjQtv
#      Auch ein kompletter eingefügter Freigabelink funktioniert, z.B.
#      gdrive://https://drive.google.com/drive/u/0/folders/1nPNjASa1uJTt6UR2wTa3VZ4SYd-MjQtv
#      → die ID wird per Regex extrahiert.
#
#   2. Name/Pfad (Fallback, z.B. per path-to-link.sh erzeugt):
#      gdrive://Team%20AGENCYFLOW/Kunden/XY%20GmbH
#
# $1 = die komplette URL

set -euo pipefail

RAW_URL="${1:-}"

if [ -z "$RAW_URL" ]; then
  osascript -e 'display alert "GDrive öffnen" message "Keine URL übergeben."'
  exit 1
fi

PAYLOAD="${RAW_URL#gdrive://}"

MOUNT_DIR=$(find "$HOME/Library/CloudStorage" -maxdepth 1 -type d -iname "GoogleDrive-*" 2>/dev/null | head -n1)

if [ -z "$MOUNT_DIR" ]; then
  osascript -e 'display alert "Google Drive nicht gemountet" message "Bitte Google Drive for Desktop öffnen und einloggen, dann erneut versuchen."'
  exit 1
fi

DRIVE_ID=$(python3 -c "
import re, sys, urllib.parse

payload = urllib.parse.unquote(sys.argv[1])

for pattern in (r'/folders/([A-Za-z0-9_-]{10,})', r'/file/d/([A-Za-z0-9_-]{10,})', r'[?&]id=([A-Za-z0-9_-]{10,})'):
    m = re.search(pattern, payload)
    if m:
        print(m.group(1))
        sys.exit(0)

if '/' not in payload and re.fullmatch(r'[A-Za-z0-9_-]{10,}', payload):
    print(payload)
    sys.exit(0)
" "$PAYLOAD")

if [ -n "$DRIVE_ID" ]; then
  RELATIVE_PATH=""
  for DB in "$HOME/Library/Application Support/Google/DriveFS"/*/metadata_sqlite_db; do
    [ -f "$DB" ] || continue
    RESULT=$(sqlite3 "$DB" "
      WITH RECURSIVE chain(stable_id, local_title, depth) AS (
        SELECT i.stable_id, i.local_title, 0
        FROM items i WHERE i.id = '$DRIVE_ID'
        UNION ALL
        SELECT p.parent_stable_id, i2.local_title, chain.depth + 1
        FROM stable_parents p
        JOIN items i2 ON i2.stable_id = p.parent_stable_id
        JOIN chain ON chain.stable_id = p.item_stable_id
        WHERE chain.depth < 20
      )
      SELECT local_title FROM chain ORDER BY depth DESC;
    " 2>/dev/null || true)
    if [ -n "$RESULT" ]; then
      RELATIVE_PATH=$(echo "$RESULT" | paste -sd '/' -)
      break
    fi
  done

  if [ -z "$RELATIVE_PATH" ]; then
    osascript -e "display alert \"Drive-ID nicht gefunden\" message \"'$DRIVE_ID' ist lokal nicht bekannt — synchronisiert Google Drive for Desktop gerade noch, oder hast du keinen Zugriff auf diese Datei?\""
    exit 1
  fi

  DRIVE_NAME="${RELATIVE_PATH%%/*}"
  if [ "$DRIVE_NAME" = "$RELATIVE_PATH" ]; then
    SUBPATH=""
  else
    SUBPATH="${RELATIVE_PATH#*/}"
  fi
else
  DECODED_PATH=$(python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(sys.argv[1]))" "$PAYLOAD")

  if [ -z "$DECODED_PATH" ]; then
    osascript -e 'display alert "GDrive öffnen" message "Leerer Pfad in der URL."'
    exit 1
  fi

  DRIVE_NAME="${DECODED_PATH%%/*}"
  if [ "$DRIVE_NAME" = "$DECODED_PATH" ]; then
    SUBPATH=""
  else
    SUBPATH="${DECODED_PATH#*/}"
  fi
fi

TARGET_DIR=$(find "$MOUNT_DIR" -maxdepth 2 -type d -iname "$DRIVE_NAME" 2>/dev/null | head -n1)

if [ -z "$TARGET_DIR" ]; then
  osascript -e "display alert \"Ordner nicht gefunden\" message \"'$DRIVE_NAME' wurde lokal nicht gefunden. Ist die Ablage synchronisiert / hast du Zugriff?\""
  exit 1
fi

FULL_PATH="$TARGET_DIR"
if [ -n "$SUBPATH" ]; then
  FULL_PATH="$TARGET_DIR/$SUBPATH"
fi

if [ ! -e "$FULL_PATH" ]; then
  osascript -e "display alert \"Unterordner nicht gefunden\" message \"'$SUBPATH' existiert nicht unter '$DRIVE_NAME'. Öffne stattdessen die Ablage selbst.\""
  open "$TARGET_DIR"
  exit 0
fi

open "$FULL_PATH"
GDRIVE_RESOLVER_SCRIPT_EOF

chmod +x "$APP/Contents/Resources/open-in-drive.sh"

# 3. URL-Schema "gdrive" registrieren
echo "3/5  URL-Schema wird eingetragen ..."
PLIST="$APP/Contents/Info.plist"
/usr/libexec/PlistBuddy -c "Add :CFBundleIdentifier string $BUNDLE_ID" "$PLIST" 2>/dev/null || \
  /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $BUNDLE_ID" "$PLIST"
/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes array" "$PLIST"
/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:0 dict" "$PLIST"
/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:0:CFBundleURLName string 'GDrive Handler'" "$PLIST"
/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:0:CFBundleURLSchemes array" "$PLIST"
/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:0:CFBundleURLSchemes:0 string gdrive" "$PLIST"

# 4. Signieren + bei LaunchServices registrieren + einmal starten
echo "4/5  App wird signiert und beim System registriert ..."
codesign --force --deep --sign - "$APP" 2>&1 | grep -v "replacing existing signature" || true
"$LSREGISTER" -f "$APP"
open -g "$APP" 2>/dev/null || true
sleep 1

# 5. Registrierung ohne GUI-Seiteneffekte verifizieren
echo "5/5  Installation wird geprüft ..."
DUMP=$("$LSREGISTER" -dump 2>/dev/null)
echo ""
if echo "$DUMP" | grep -A 100 "identifier: *$BUNDLE_ID" | grep -q "claimed schemes:.*gdrive:"; then
  echo "✅ Fertig! Links im Format gdrive://... öffnen jetzt automatisch den"
  echo "   passenden Google-Drive-Ordner in Finder."
  echo ""
  echo "   Falls beim allerersten Klick auf einen solchen Link eine"
  echo "   macOS-Sicherheitsabfrage erscheint (\"$APP_NAME darf Links öffnen?\"),"
  echo "   bitte bestätigen — das kommt nur einmal."
else
  echo "❌ Etwas ist schiefgelaufen — die Registrierung konnte nicht bestätigt"
  echo "   werden. Bitte diese Ausgabe an Julian weiterleiten."
  exit 1
fi
