#!/usr/bin/env node

/**
 * Script de déploiement automatique pour Firebase Hosting
 * - Bascule en mode PRODUCTION
 * - Incrémente la version
 * - Build l'application Flutter pour le web
 * - Vérifie que version.json est bien présent
 * - Déploie sur Firebase Hosting (avec en-têtes CORS pour version.json)
 * - Vérifie que version.json est accessible avec CORS
 * - Rebascule en mode DÉVELOPPEMENT
 */

const { execSync } = require('child_process');
const { incrementVersion } = require('./increment_version');
const { setProductionMode, setDevelopmentMode } = require('./toggle_env');
const fs = require('fs');
const path = require('path');
const https = require('https');

console.log('🚀 Démarrage du déploiement Firebase Hosting...\n');

// Étape 0: Basculer en mode production
console.log('🔒 Étape 0/5: Basculement en mode PRODUCTION');
if (!setProductionMode()) {
  console.error('❌ Impossible de basculer en mode production');
  process.exit(1);
}
console.log('');

// Étape 1: Incrémenter la version
console.log('📝 Étape 1/5: Incrémentation de la version');
const newVersion = incrementVersion();
console.log('');

// Étape 2: Build Flutter pour le web
console.log('🔨 Étape 2/5: Build Flutter Web');
try {
  execSync('flutter build web --release', {
    stdio: 'inherit',
    cwd: process.cwd()
  });
  console.log('✅ Build terminé avec succès\n');
} catch (error) {
  console.error('❌ Erreur lors du build Flutter');
  // Rebascule en mode dev avant de quitter
  setDevelopmentMode();
  process.exit(1);
}

// Étape 2.5: Vérifier que version.json est bien présent dans build/web
console.log('🔍 Étape 2.5/5: Vérification de version.json');
const versionJsonPath = path.join(process.cwd(), 'build', 'web', 'version.json');
if (!fs.existsSync(versionJsonPath)) {
  console.warn('⚠️  version.json n\'a pas été copié dans build/web/');

  // Copier manuellement depuis web/version.json
  const sourceVersionJsonPath = path.join(process.cwd(), 'web', 'version.json');
  if (fs.existsSync(sourceVersionJsonPath)) {
    console.log('  → Copie de web/version.json vers build/web/...');
    fs.copyFileSync(sourceVersionJsonPath, versionJsonPath);
    console.log('✅ Fichier version.json copié avec succès');
  } else {
    console.error('❌ Impossible de trouver web/version.json');
    setDevelopmentMode();
    process.exit(1);
  }
} else {
  console.log('✅ version.json est présent dans build/web/');
}

// Afficher la version qui va être déployée
try {
  const versionContent = JSON.parse(fs.readFileSync(versionJsonPath, 'utf8'));
  console.log(`  📦 Version: ${versionContent.version}`);
  console.log(`  🔒 Force update: ${versionContent.forceUpdate}`);
} catch (error) {
  console.warn('⚠️  Impossible de lire version.json');
}
console.log('');

// Étape 3: Déploiement Firebase
console.log('🌐 Étape 3/5: Déploiement sur Firebase Hosting');
console.log('  ℹ️  Les en-têtes CORS pour version.json seront appliqués automatiquement');
try {

  execSync('firebase deploy --only hosting', {
    stdio: 'inherit',
    cwd: process.cwd()
  });
  console.log('\n✅ Déploiement terminé avec succès!');
  console.log(`🎉 Version ${newVersion} déployée sur Firebase Hosting`);
} catch (error) {
  console.error('❌ Erreur lors du déploiement Firebase');
  // Rebascule en mode dev avant de quitter
  setDevelopmentMode();
  process.exit(1);
}

// Étape 4: Vérifier que version.json est accessible avec CORS
console.log('\n🔍 Étape 4/5: Vérification de l\'accès à version.json');
setTimeout(() => {
  https.get('https://app.em2events.fr/version.json', {
    headers: {
      'Origin': 'http://localhost'
    }
  }, (res) => {
    if (res.statusCode === 200) {
      console.log('✅ version.json est accessible (statut 200)');

      // Vérifier les en-têtes CORS
      const corsHeader = res.headers['access-control-allow-origin'];
      if (corsHeader) {
        console.log(`✅ En-têtes CORS configurés: ${corsHeader}`);
      } else {
        console.warn('⚠️  En-têtes CORS non détectés (peuvent prendre quelques minutes pour se propager)');
      }

      // Lire et afficher la version déployée
      let body = '';
      res.on('data', chunk => body += chunk);
      res.on('end', () => {
        try {
          const deployed = JSON.parse(body);
          console.log(`📦 Version déployée: ${deployed.version}`);
        } catch (e) {
          // Ignore
        }
      });
    } else {
      console.warn(`⚠️  Statut HTTP: ${res.statusCode}`);
    }
  }).on('error', (err) => {
    console.warn('⚠️  Impossible de vérifier l\'accès à version.json');
    console.warn(`   ${err.message}`);
    console.warn('   Le fichier peut prendre quelques minutes pour être accessible');
  });
}, 2000); // Attendre 2 secondes pour que le déploiement se propage

// Étape 5: Rebascule en mode développement
console.log('\n🔓 Étape 5/5: Retour en mode DÉVELOPPEMENT');
if (!setDevelopmentMode()) {
  console.warn('⚠️ Impossible de rebascule en mode développement');
  console.warn('⚠️ Exécutez manuellement: npm run env:dev');
} else {
  console.log('✅ Mode développement restauré');
}

console.log('\n✨ Processus de déploiement terminé!');
console.log('📝 Les utilisateurs recevront une notification de mise à jour au prochain chargement.');
