#!/bin/bash
set -e
set -o pipefail

echo "=== Installing Flutter SDK ==="
FLUTTER_VERSION="3.41.4"
git clone --depth 1 --branch "$FLUTTER_VERSION" https://github.com/flutter/flutter.git "$HOME/flutter"
export PATH="$HOME/flutter/bin:$PATH"
export COCOAPODS_DISABLE_STATS=true

echo "=== Flutter doctor ==="
flutter doctor -v

echo "=== Flutter precache (iOS) ==="
flutter precache --ios

echo "=== Flutter pub get ==="
if [ -f "$CI_PRIMARY_REPOSITORY_PATH/pubspec.yaml" ]; then
  PROJECT_DIR="$CI_PRIMARY_REPOSITORY_PATH"
elif [ -d "$CI_PRIMARY_REPOSITORY_PATH/carbuy_mobile" ]; then
  PROJECT_DIR="$CI_PRIMARY_REPOSITORY_PATH/carbuy_mobile"
elif [ -d "$CI_PRIMARY_REPOSITORY_PATH/apps_code/carbuy_mobile" ]; then
  PROJECT_DIR="$CI_PRIMARY_REPOSITORY_PATH/apps_code/carbuy_mobile"
else
  echo "Could not locate Flutter project directory."
  echo "Checked:"
  echo "  - $CI_PRIMARY_REPOSITORY_PATH/carbuy_mobile"
  echo "  - $CI_PRIMARY_REPOSITORY_PATH/apps_code/carbuy_mobile"
  exit 1
fi

cd "$PROJECT_DIR"
flutter pub get

echo "=== Patch GeneratedPluginRegistrant for iOS 16-only Passkeys plugin ==="
GEN_REG="$PROJECT_DIR/ios/Runner/GeneratedPluginRegistrant.m"
if [ -f "$GEN_REG" ]; then
  python3 - "$GEN_REG" <<'PY'
import pathlib
import sys

path = pathlib.Path(sys.argv[1])
text = path.read_text()
target = '  [PasskeysPlugin registerWithRegistrar:[registry registrarForPlugin:@"PasskeysPlugin"]];'
replacement = (
    '  if (@available(iOS 16.0, *)) {\n'
    '    [PasskeysPlugin registerWithRegistrar:[registry registrarForPlugin:@"PasskeysPlugin"]];\n'
    '  }'
)
if target in text and replacement not in text:
    path.write_text(text.replace(target, replacement))
    print("Patched GeneratedPluginRegistrant.m for Passkeys availability.")
else:
    print("GeneratedPluginRegistrant.m patch not needed.")
PY
else
  echo "GeneratedPluginRegistrant.m not found; skipping patch."
fi

echo "=== Pod install ==="
cd ios
rm -rf Pods Podfile.lock

echo "=== DNS check for dl.google.com (required by FirebaseAnalytics pod download) ==="
HOST="dl.google.com"
DNS_OK=0
DNS_MAX_ATTEMPTS=5
DNS_ATTEMPT=1
while [ "$DNS_ATTEMPT" -le "$DNS_MAX_ATTEMPTS" ]; do
  if ruby -rresolv -e "Resolv.getaddress('$HOST')" >/dev/null 2>&1; then
    DNS_OK=1
    break
  fi
  echo "DNS lookup failed for $HOST (attempt $DNS_ATTEMPT/$DNS_MAX_ATTEMPTS)."
  if [ "$DNS_ATTEMPT" -lt "$DNS_MAX_ATTEMPTS" ]; then
    sleep $((DNS_ATTEMPT * 2))
  fi
  DNS_ATTEMPT=$((DNS_ATTEMPT + 1))
done

if [ "$DNS_OK" -ne 1 ]; then
  echo "Warning: DNS still failing for $HOST. Proceeding with pod retries."
fi

POD_MAX_ATTEMPTS=5
POD_ATTEMPT=1
while [ "$POD_ATTEMPT" -le "$POD_MAX_ATTEMPTS" ]; do
  echo "pod install attempt $POD_ATTEMPT/$POD_MAX_ATTEMPTS..."
  POD_LOG_FILE="/tmp/pod_install_${POD_ATTEMPT}.log"
  if pod install --repo-update >"$POD_LOG_FILE" 2>&1; then
    cat "$POD_LOG_FILE"
    break
  fi
  cat "$POD_LOG_FILE"
  if grep -q "Flutter.xcframework must exist" "$POD_LOG_FILE"; then
    echo "pod install failed: Flutter iOS engine artifacts are missing."
    echo "Make sure 'flutter precache --ios' runs successfully before pod install."
    exit 1
  fi
  if grep -q "Swift pods cannot yet be integrated as static libraries" "$POD_LOG_FILE"; then
    echo "pod install failed due to Podfile configuration (static Swift pods / modular headers)."
    echo "Please verify ios/Podfile contains: use_modular_headers!"
    exit 1
  fi
  if [ "$POD_ATTEMPT" -ge "$POD_MAX_ATTEMPTS" ]; then
    echo "pod install failed after $POD_MAX_ATTEMPTS attempts."
    exit 1
  fi
  sleep $((POD_ATTEMPT * 3))
  POD_ATTEMPT=$((POD_ATTEMPT + 1))
done

echo "=== Done ==="
