#!/bin/bash
set -e

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="$SCRIPT_DIR"
SRC_DIR="$PROJECT_DIR/src"
BUILD_DIR="$PROJECT_DIR/build"
CLANG="/usr/bin/clang-19"
LLD="/usr/bin/ld64.lld-19"

VERSION="${1:-}"
SDK="${SDK:-/home/alina/sdk/iPhoneOS16.5.sdk}"

# Leggi versione REALE da Info.plist
if [ -z "$VERSION" ]; then
  VERSION=$(python3 -c "
import plistlib
with open('$SRC_DIR/Info.plist', 'rb') as f:
    pl = plistlib.load(f)
print(pl.get('CFBundleShortVersionString', '1.0'))
")
fi

if [[ ! "$VERSION" =~ ^[0-9]+([.][0-9]+)*$ ]]; then
  echo "❌ Versione non valida: $VERSION"
  exit 1
fi

# Mantieni sincronizzati nome IPA e versione riconosciuta da iOS.
python3 - "$SRC_DIR/Info.plist" "$VERSION" <<'PYEOF'
import os, plistlib, sys, tempfile
path, version = sys.argv[1], sys.argv[2]
with open(path, "rb") as f:
    plist = plistlib.load(f)
plist["CFBundleShortVersionString"] = version
plist["CFBundleVersion"] = version
directory = os.path.dirname(path)
fd, temporary = tempfile.mkstemp(prefix="Info.plist.", dir=directory)
try:
    with os.fdopen(fd, "wb") as f:
        plistlib.dump(plist, f, fmt=plistlib.FMT_XML, sort_keys=False)
    os.replace(temporary, path)
finally:
    if os.path.exists(temporary):
        os.unlink(temporary)
PYEOF

echo "🔨 Building aNavigator v$VERSION..."
echo "   SDK: $SDK"

BUILD_TMP=$(mktemp -d)
OBJ_DIR="$BUILD_TMP/objects"
APP_DIR="$BUILD_TMP/aNavigator.app"
mkdir -p "$OBJ_DIR" "$APP_DIR"

CFLAGS=(
  -target arm64-apple-ios14.0
  -isysroot "$SDK"
  -iframework "$SDK/System/Library/Frameworks"
  -fobjc-arc -fno-modules -fvisibility=hidden
  -x objective-c++ -std=c++17 -O2
  -I"$SRC_DIR"
  -c)

echo "📦 Compiling sources..."
cd "$OBJ_DIR"

for f in main.m AppDelegate.m \
         MapViewController.mm \
         SettingsViewController.mm \
         BusViewController.mm \
         SettingsStore.mm \
         LocalizationManager.mm; do
    echo "   $f"
    $CLANG "${CFLAGS[@]}" "$SRC_DIR/$f" -o "$(basename "${f%.*}").o"
done

echo "🔗 Linking..."
$LLD -demangle \
  -arch arm64 \
  -platform_version ios 14.0 16.5 \
  -syslibroot "$SDK" \
  -lobjc -lc++ -lc -lz \
  -framework Foundation \
  -framework UIKit \
  -framework CoreGraphics \
  -framework QuartzCore \
  -framework CoreLocation \
  -framework WebKit \
  -framework AVFoundation \
  -framework SceneKit \
  -framework ModelIO \
  *.o \
  -o "$APP_DIR/aNavigator"

echo "📱 Creating .app bundle..."
cp "$SRC_DIR/Info.plist" "$APP_DIR/"
cp "$SRC_DIR/map.html" "$APP_DIR/"
cp "$SRC_DIR/gtfs_db.json" "$APP_DIR/"

BUNDLE_VERSION=$(python3 - "$APP_DIR/Info.plist" <<'PYEOF'
import plistlib, sys
with open(sys.argv[1], "rb") as f:
    plist = plistlib.load(f)
print(plist.get("CFBundleVersion", ""))
PYEOF
)
if [ "$BUNDLE_VERSION" != "$VERSION" ]; then
    echo "❌ Info.plist bundle non aggiornato: atteso $VERSION, trovato $BUNDLE_VERSION"
    exit 1
fi
echo "   Info.plist interno: v$BUNDLE_VERSION"

# Copy lib/ files (MapLibre locale)
if [ -d "$SRC_DIR/lib" ]; then
    mkdir -p "$APP_DIR/lib"
    cp "$SRC_DIR/lib/"* "$APP_DIR/lib/" 2>/dev/null || true
fi

# Copy assets
if [ -d "$PROJECT_DIR/assets" ]; then
    mkdir -p "$APP_DIR/assets"
    cp "$PROJECT_DIR/assets"/*.png "$APP_DIR/assets/" 2>/dev/null || true
    cp "$PROJECT_DIR/assets"/*.usdz "$APP_DIR/assets/" 2>/dev/null || true
    cp "$PROJECT_DIR/assets"/*.glb "$APP_DIR/assets/" 2>/dev/null || true
    # Copy 3D models also to root for sceneNamed: to find them
    cp "$PROJECT_DIR/assets"/brisbane_city_bus.usdz "$APP_DIR/" 2>/dev/null || true
    cp "$PROJECT_DIR/assets"/*.png "$APP_DIR/" 2>/dev/null || true
fi

# Copy pill background image
cp "$SRC_DIR/pill_bg.jpg" "$APP_DIR/" 2>/dev/null || true
# Copy stop pill background image
cp "$SRC_DIR/stop_pill_bg.jpg" "$APP_DIR/" 2>/dev/null || true
cp "$SRC_DIR/stop_pill_cropped.jpg" "$APP_DIR/" 2>/dev/null || true
cp "$SRC_DIR/road_pill_bg.jpg" "$APP_DIR/" 2>/dev/null || true
cp "$SRC_DIR/bus_icon.png" "$APP_DIR/" 2>/dev/null || true
cp "$SRC_DIR/pin_icon.png" "$APP_DIR/" 2>/dev/null || true
cp "$SRC_DIR/clock_icon.png" "$APP_DIR/" 2>/dev/null || true
cp "$SRC_DIR/arrow_icon.png" "$APP_DIR/" 2>/dev/null || true

# Copy any .stile tiles if present
if [ -d "$SRC_DIR/tiles" ]; then
    cp -r "$SRC_DIR/tiles" "$APP_DIR/" 2>/dev/null || true
fi

echo "📦 Creating IPA..."
mkdir -p "$BUILD_DIR" "$BUILD_TMP/Payload"
cp -R "$APP_DIR" "$BUILD_TMP/Payload/"
cd "$BUILD_TMP"
python3 <<PYEOF
import zipfile, os
ipa_path = "$BUILD_DIR/aNavigator_v$VERSION.ipa"
with zipfile.ZipFile(ipa_path, 'w', zipfile.ZIP_DEFLATED) as zf:
    for root, dirs, files in os.walk("Payload"):
        for f in files:
            filepath = os.path.join(root, f)
            zf.write(filepath, filepath)
print("IPA:", ipa_path)
PYEOF

cd "$PROJECT_DIR"
rm -rf "$BUILD_TMP"

echo "✅ Build completata!"
echo "   IPA: $BUILD_DIR/aNavigator_v$VERSION.ipa"
ls -lh "$BUILD_DIR/aNavigator_v$VERSION.ipa"

if [ "${ANAVIGATOR_SKIP_BACKUP:-0}" = "1" ]; then
    echo "ℹ️  Solo compilazione richiesta: backup e push non eseguiti."
    exit 0
fi

echo "📂 Backup automatico in backup/v$VERSION/..."
BACKUP_DIR="$PROJECT_DIR/backup/v$VERSION"
mkdir -p "$BACKUP_DIR"
# Snapshot completo del progetto sorgente. Esclude soltanto repository Git,
# backup precedenti, dipendenze e artefatti generati dalla compilazione.
rsync -a \
  --exclude '/.git/' \
  --exclude '/backup/' \
  --exclude '/build/' \
  --exclude '/Payload/' \
  --exclude '/node_modules/' \
  --exclude '/venv/' \
  --exclude '/.build/' \
  --exclude '/MapLibre.xcframework/' \
  --exclude '/MapLibre.static.xcframework.zip' \
  "$PROJECT_DIR/" "$BACKUP_DIR/"
echo "   Backup locale: $BACKUP_DIR"

echo "☁️  Push backup su GitHub..."
cd "$PROJECT_DIR"
# Assicurati di essere su main PRIMA di commitare
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
if [ "$CURRENT_BRANCH" != "main" ]; then
    git checkout main 2>/dev/null || true
    # Merge il commit corrente su main (cherry-pick dalla detached HEAD)
    git merge -m "Merge v$VERSION in main" "$CURRENT_BRANCH" 2>/dev/null || true
fi
git add "backup/v$VERSION/" 2>/dev/null || true
git commit -m "Backup v$VERSION" 2>/dev/null || echo "   Niente da committare"
git push origin main 2>&1 && echo "   ✅ GitHub push OK" || echo "   ⚠️ GitHub push fallito"
echo "   ✅ Backup su GitHub completato!"
