#!/usr/bin/env node
/**
 * ═══════════════════════════════════════════════════════════════════════════════
 * SETUP WINDOWS SCRIPT (SIMPLIFIÉ)
 * ═══════════════════════════════════════════════════════════════════════════════
 * Script d'installation automatique pour OverMind-MCP sur Windows
 * avec PostgreSQL + pgvector uniquement.
 *
 * Usage:
 *   node scripts/setup-windows.js
 * ═══════════════════════════════════════════════════════════════════════════════
 */

import { execSync } from 'child_process';
import { existsSync, readFileSync, writeFileSync, copyFileSync } from 'fs';
import { join } from 'path';
import { fileURLToPath } from 'url';
import { dirname } from 'path';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const projectRoot = join(__dirname, '..');

// ═══════════════════════════════════════════════════════════════════════════════
// UTILITIES
// ═══════════════════════════════════════════════════════════════════════════════

function runCommand(command, description) {
  console.log(`\n🔧 ${description}`);
  console.log(`   $ ${command}`);
  try {
    execSync(command, { cwd: projectRoot, stdio: 'inherit' });
    console.log(`✅ ${description} terminé`);
    return true;
  } catch (error) {
    console.error(`❌ Erreur: ${error.message}`);
    return false;
  }
}

function logSection(title) {
  console.log('\n╔══════════════════════════════════════════════════════════════════╗');
  console.log(`║  ${title.padEnd(64)} ║`);
  console.log('╚══════════════════════════════════════════════════════════════════╝');
}

// ═══════════════════════════════════════════════════════════════════════════════
// CHECKS
// ═══════════════════════════════════════════════════════════════════════════════

function checkPrerequisites() {
  logSection('VÉRIFICATION PRÉREQUIS');

  // Check Node.js
  try {
    const nodeVersion = execSync('node --version', { encoding: 'utf8' }).trim();
    console.log(`✅ Node.js: ${nodeVersion}`);
  } catch {
    console.error('❌ Node.js non trouvé. Installez Node.js 20+');
    return false;
  }

  // Check pnpm
  try {
    const pnpmVersion = execSync('pnpm --version', { encoding: 'utf8' }).trim();
    console.log(`✅ pnpm: ${pnpmVersion}`);
  } catch {
    console.error('❌ pnpm non trouvé. Installez pnpm:');
    console.error('   npm install -g pnpm');
    return false;
  }

  // Check Docker
  try {
    const dockerVersion = execSync('docker --version', { encoding: 'utf8' }).trim();
    console.log(`✅ Docker: ${dockerVersion}`);
  } catch {
    console.error('❌ Docker non trouvé. Installez Docker Desktop:');
    console.error('   https://www.docker.com/products/docker-desktop/');
    return false;
  }

  // Check PostgreSQL container
  try {
    const pgContainers = execSync('docker ps --filter "name=postgres-pgvector" --format "{{.Names}}"', { encoding: 'utf8' }).trim();
    if (pgContainers) {
      console.log(`✅ PostgreSQL container: ${pgContainers}`);
    } else {
      console.error('❌ Container postgres-pgvector non trouvé');
      console.error('   Assurez-vous que PostgreSQL + pgvector tourne en Docker');
      return false;
    }
  } catch {
    console.error('❌ Impossible de vérifier le container PostgreSQL');
    return false;
  }

  return true;
}

function checkEnvFile() {
  logSection('VÉRIFICATION FICHIER .ENV');

  const envPath = join(projectRoot, '.env');
  const envExamplePath = join(projectRoot, '.env.example');

  if (!existsSync(envPath)) {
    console.log('ℹ️  .env non trouvé, création à partir de .env.example...');
    if (existsSync(envExamplePath)) {
      copyFileSync(envExamplePath, envPath);
      console.log('✅ .env créé');
      console.warn('⚠️  ÉDITEZ .env et changez:');
      console.warn('   - POSTGRES_PASSWORD=votre_mot_de_passe');
      console.warn('   - OVERMIND_EMBEDDING_KEY=votre_cle_api');
      return false; // Arrêt pour permettre l'édition
    } else {
      console.error('❌ .env.example non trouvé');
      return false;
    }
  } else {
    console.log('✅ .env existe');
    return true;
  }
}

// ═══════════════════════════════════════════════════════════════════════════════
// SETUP STEPS
// ═══════════════════════════════════════════════════════════════════════════════

async function setupDatabase() {
  logSection('INITIALISATION BASE DE DONNÉES');

  return runCommand(
    'node scripts/setup-overmind-db.js',
    'Initialisation base OverMind'
  );
}

async function startDockerServices() {
  logSection('VÉRIFICATION POSTGRESQL');

  try {
    const containers = execSync(
      'docker ps --filter "name=postgres" --format "{{.Names}}"',
      { encoding: 'utf8' }
    ).trim();

    if (containers) {
      console.log(`✅ PostgreSQL détecté: ${containers}`);
      return true;
    } else {
      console.log('⚠️  PostgreSQL non démarré. Démarrez-le avec:');
      console.log('   docker start overmind-postgres-pgvector');
      return false;
    }
  } catch (error) {
    console.error('❌ Impossible de vérifier PostgreSQL');
    return false;
  }
}

function buildProject() {
  logSection('BUILD PROJET');

  return runCommand(
    'pnpm run build',
    'Compilation TypeScript'
  );
}

function runTests() {
  logSection('TESTS UNITAIRES');

  return runCommand(
    'pnpm run test -- --run',
    'Exécution tests'
  );
}

// ═══════════════════════════════════════════════════════════════════════════════
// MAIN
// ═══════════════════════════════════════════════════════════════════════════════

async function main() {
  console.log('╔══════════════════════════════════════════════════════════════════╗');
  console.log('║                                                                ║');
  console.log('║         OVERMIND-MCP: SETUP WINDOWS AUTOMATISÉ                    ║');
  console.log('║         (PostgreSQL + pgvector uniquement)                        ║');
  console.log('║                                                                ║');
  console.log('╚══════════════════════════════════════════════════════════════════╝');
  console.log('');

  // Check prerequisites
  if (!checkPrerequisites()) {
    console.log('\n❌ PRÉREQUIS NON REMPLIS. Corrigez les problèmes ci-dessus et relancez.');
    process.exit(1);
  }

  // Check .env file
  const envReady = checkEnvFile();
  if (!envReady) {
    console.log('\n⏸️  SETUP EN PAUSE. Éditez .env avec vos credentials, puis relancez.');
    console.log('\n   Commande pour relancer:');
    console.log('   node scripts/setup-windows.js');
    process.exit(0);
  }

  // Setup database
  const dbSetup = await setupDatabase();
  if (!dbSetup) {
    console.log('\n❌ ERREUR INITIALISATION BASE DE DONNÉES');
    process.exit(1);
  }

  // Build project
  const projectBuilt = buildProject();
  if (!projectBuilt) {
    console.log('\n❌ ERREUR BUILD PROJET');
    process.exit(1);
  }

  // Run tests
  runTests();

  // Success!
  logSection('✅ SETUP TERMINÉ AVEC SUCCÈS');

  console.log(`
🎉 OVERMIND-MCP EST PRÊT !

📋 SERVICE DÉMARRÉ:
   ✅ PostgreSQL + pgvector (Mémoire Vectorielle)

🌐 CONNEXION:
   🗄️  PostgreSQL:    localhost:5432
   👤 User:         postgres
   🔑 Password:     overmind_temp_password_change_me (À CHANGER !)

🚀 POUR DÉMARRER OVERMIND:
   pnpm run dev      # Mode développement
   pnpm run start    # Mode production

📚 DOCUMENTATION:
   - SETUP_WINDOWS.md (guide complet)

💡 PREMIER TEST:
   create_agent({
     name: 'test-agent',
     prompt: 'Tu es un agent de test',
     runner: 'claude'
   })

═════════════════════════════════════════════════════════════════════
`);
}

// ═══════════════════════════════════════════════════════════════════════════════
// ENTRY POINT
// ═══════════════════════════════════════════════════════════════════════════════

if (import.meta.url === `file://${process.argv[1]}`) {
  main().catch((error) => {
    console.error('\n❌ ERREUR FATALE:', error.message);
    process.exit(1);
  });
}
