#!/bin/bash

# Script de génération du bundle Android pour GEOSECTOR
# Usage: ./android.sh

set -e  # Arrêter le script en cas d'erreur

# Couleurs pour les messages
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Fonction pour afficher les messages
print_message() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

# Fonction pour gérer les erreurs
handle_error() {
    print_error "Une erreur est survenue lors de l'exécution de la commande"
    print_error "Ligne $1"
    exit 1
}

# Trap pour capturer les erreurs
trap 'handle_error $LINENO' ERR

# Vérifier que nous sommes dans le bon dossier
if [ ! -f "pubspec.yaml" ]; then
    print_error "Ce script doit être exécuté depuis le dossier racine de l'application Flutter"
    print_error "Fichier pubspec.yaml introuvable"
    exit 1
fi

print_message "========================================="
print_message "   GEOSECTOR - Génération Bundle Android"
print_message "========================================="
echo

# Vérifier que Flutter est installé
if ! command -v flutter &> /dev/null; then
    print_error "Flutter n'est pas installé ou n'est pas dans le PATH"
    exit 1
fi

# Récupérer la version depuis pubspec.yaml
VERSION=$(grep "^version:" pubspec.yaml | sed 's/version: //' | sed 's/+/-/')
if [ -z "$VERSION" ]; then
    print_error "Impossible de récupérer la version depuis pubspec.yaml"
    exit 1
fi

# Extraire le version code
VERSION_CODE=$(echo $VERSION | cut -d'-' -f2)
if [ -z "$VERSION_CODE" ]; then
    print_error "Impossible d'extraire le version code"
    exit 1
fi

print_message "Version détectée : $VERSION"
print_message "Version code : $VERSION_CODE"
echo

# Vérifier la présence du keystore
if [ ! -f "android/app/geosector2025.jks" ]; then
    print_error "Fichier keystore introuvable : android/app/geosector2025.jks"
    exit 1
fi

# Vérifier la présence du fichier key.properties
if [ ! -f "android/key.properties" ]; then
    print_error "Fichier key.properties introuvable"
    print_error "Ce fichier est nécessaire pour signer l'application"
    exit 1
fi

print_success "Configuration de signature vérifiée"
echo

# Étape 1 : Nettoyer le projet
print_message "Étape 1/4 : Nettoyage du projet..."
flutter clean
if [ $? -eq 0 ]; then
    print_success "Projet nettoyé"
else
    print_error "Échec du nettoyage du projet"
    exit 1
fi
echo

# Étape 2 : Récupérer les dépendances
print_message "Étape 2/4 : Récupération des dépendances..."
flutter pub get
if [ $? -eq 0 ]; then
    print_success "Dépendances récupérées"
else
    print_error "Échec de la récupération des dépendances"
    exit 1
fi

# Patch nfc_manager 3.3.0 (AndroidManifest namespace)
print_message "Application du patch nfc_manager 3.3.0..."
./fastlane/scripts/commun/fix-nfc-manager.sh || {
    print_error "Échec du patch nfc_manager"
    exit 1
}
echo

# Étape 3 : Analyser le code (optionnel mais recommandé)
print_message "Étape 3/4 : Analyse du code Dart..."
flutter analyze --no-fatal-infos --no-fatal-warnings || {
    print_warning "Des avertissements ont été détectés dans le code"
    read -p "Voulez-vous continuer malgré les avertissements ? (y/n) " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        print_message "Génération annulée par l'utilisateur"
        exit 0
    fi
}
print_success "Analyse du code terminée"
echo

# Étape 4 : Générer le bundle
print_message "Étape 4/4 : Génération du bundle Android..."
print_message "Cette opération peut prendre plusieurs minutes..."
flutter build appbundle --release
if [ $? -eq 0 ]; then
    print_success "Bundle généré avec succès"
else
    print_error "Échec de la génération du bundle"
    exit 1
fi
echo

# Vérifier que le bundle a été créé
BUNDLE_PATH="build/app/outputs/bundle/release/app-release.aab"
if [ ! -f "$BUNDLE_PATH" ]; then
    print_error "Bundle introuvable à l'emplacement attendu : $BUNDLE_PATH"
    exit 1
fi

# Copier le bundle à la racine avec le nouveau nom
FINAL_NAME="geosector-$VERSION_CODE.aab"
print_message "Copie du bundle vers : $FINAL_NAME"
cp "$BUNDLE_PATH" "$FINAL_NAME"

if [ -f "$FINAL_NAME" ]; then
    print_success "Bundle copié avec succès"
    
    # Afficher la taille du fichier
    FILE_SIZE=$(du -h "$FINAL_NAME" | cut -f1)
    print_message "Taille du bundle : $FILE_SIZE"
else
    print_error "Échec de la copie du bundle"
    exit 1
fi

echo
print_message "========================================="
print_success "   GÉNÉRATION TERMINÉE AVEC SUCCÈS !"
print_message "========================================="
echo
print_message "Bundle généré : ${GREEN}$FINAL_NAME${NC}"
print_message "Version : $VERSION"
print_message "Chemin : $(pwd)/$FINAL_NAME"
echo
print_message "Prochaines étapes :"
print_message "1. Tester le bundle sur un appareil Android"
print_message "2. Uploader sur Google Play Console"
print_message "3. Soumettre pour review"
echo

# Optionnel : Générer aussi l'APK
read -p "Voulez-vous aussi générer l'APK pour des tests ? (y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
    print_message "Génération de l'APK..."
    flutter build apk --release
    
    if [ $? -eq 0 ]; then
        APK_PATH="build/app/outputs/flutter-apk/app-release.apk"
        if [ -f "$APK_PATH" ]; then
            APK_NAME="geosector-$VERSION_CODE.apk"
            cp "$APK_PATH" "$APK_NAME"
            print_success "APK généré : $APK_NAME"
            
            # Afficher la taille de l'APK
            APK_SIZE=$(du -h "$APK_NAME" | cut -f1)
            print_message "Taille de l'APK : $APK_SIZE"
        fi
    else
        print_warning "Échec de la génération de l'APK (le bundle a été créé avec succès)"
    fi
fi

echo
print_success "Script terminé !"