#!/usr/bin/env node
/**
 * ═══════════════════════════════════════════════════════════════════════════════
 * SETUP OVERMIND DATABASE (PostgreSQL Existant)
 * ═══════════════════════════════════════════════════════════════════════════════
 * Script qui initialise la base de données OverMind dans votre PostgreSQL existant
 *
 * Prérequis:
 *   - PostgreSQL + pgvector déjà en Docker (container: postgres-pgvector)
 *   - Node.js installé
 *
 * Usage:
 *   node scripts/setup-overmind-db.js
 * ═══════════════════════════════════════════════════════════════════════════════
 */

import { Client } from 'pg';
import { readFileSync } from 'fs';
import { dirname, join } from 'path';
import { fileURLToPath } from 'url';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

// ═══════════════════════════════════════════════════════════════════════════════
// CONFIGURATION
// ═══════════════════════════════════════════════════════════════════════════════

const DB_CONFIG = {
  host: process.env.POSTGRES_HOST || 'localhost',
  port: parseInt(process.env.POSTGRES_PORT || '5432', 10),
  user: process.env.POSTGRES_USER || 'postgres',
  password: process.env.POSTGRES_PASSWORD || 'postgres',
  database: 'postgres', // Se connecter à postgres pour créer la DB
};

const OVERMIND_DB_NAME = 'overmind_memory';

// ═══════════════════════════════════════════════════════════════════════════════
// FUNCTIONS
// ═══════════════════════════════════════════════════════════════════════════════

async function checkPgVectorExtension(client) {
  console.log('🔍 Vérification extension pgvector...');

  try {
    const res = await client.query(`
      SELECT 1 FROM pg_available_extensions
      WHERE name = 'vector'
    `);

    if (res.rows.length === 0) {
      console.error('❌ pgvector n\'est pas installé !');
      console.error('   Installez-le avec: CREATE EXTENSION vector;');
      throw new Error('pgvector extension not found');
    }

    console.log('✅ Extension pgvector trouvée');
  } catch (error) {
    console.error('❌ Erreur vérification pgvector:', error.message);
    throw error;
  }
}

async function createDatabase(client) {
  console.log(`🔍 Vérification base de données ${OVERMIND_DB_NAME}...`);

  try {
    // Vérifier si la DB existe déjà
    const checkRes = await client.query(
      'SELECT 1 FROM pg_database WHERE datname = $1',
      [OVERMIND_DB_NAME]
    );

    if (checkRes.rows.length > 0) {
      console.log(`ℹ️  Base de données ${OVERMIND_DB_NAME} existe déjà`);
      return;
    }

    // Créer la DB
    console.log(`🏗️  Création base de données ${OVERMIND_DB_NAME}...`);
    await client.query(`CREATE DATABASE "${OVERMIND_DB_NAME}"`);
    console.log(`✅ Base de données ${OVERMIND_DB_NAME} créée`);

  } catch (error) {
    if (error.code === '42P04') {
      // Duplicate database - c'est ok
      console.log(`ℹ️  Base de données ${OVERMIND_DB_NAME} existe déjà`);
      return;
    }
    console.error('❌ Erreur création DB:', error.message);
    throw error;
  }
}

async function initializeOvermindDb() {
  console.log(`🔍 Initialisation base de données ${OVERMIND_DB_NAME}...`);

  const client = new Client({
    ...DB_CONFIG,
    database: OVERMIND_DB_NAME,
  });

  try {
    await client.connect();
    console.log(`✅ Connecté à ${OVERMIND_DB_NAME}`);

    // Activer pgvector
    console.log('🔧 Activation extension pgvector...');
    await client.query('CREATE EXTENSION IF NOT EXISTS vector');
    console.log('✅ Extension pgvector activée');

    // Créer les tables (via init-db.sql)
    const initSqlPath = join(__dirname, '../init-db.sql');
    try {
      const initSql = readFileSync(initSqlPath, 'utf8');
      console.log('🔧 Exécution init-db.sql...');
      await client.query(initSql);
      console.log('✅ Tables initialisées');
    } catch (error) {
      console.warn('⚠️  Erreur init-db.sql (peut-être déjà exécuté):', error.message);
    }

  } finally {
    await client.end();
    console.log(`✅ Déconnecté de ${OVERMIND_DB_NAME}`);
  }
}

async function main() {
  console.log('╔══════════════════════════════════════════════════════════════════╗');
  console.log('║  SETUP OVERMIND DATABASE (PostgreSQL Existant)                   ║');
  console.log('╚══════════════════════════════════════════════════════════════════╝');
  console.log('');

  const client = new Client(DB_CONFIG);

  try {
    // Se connecter à postgres
    console.log('🔌 Connexion à PostgreSQL...');
    await client.connect();
    console.log(`✅ Connecté à PostgreSQL (${DB_CONFIG.host}:${DB_CONFIG.port})`);
    console.log('');

    // Étape 1: Vérifier pgvector
    await checkPgVectorExtension(client);
    console.log('');

    // Étape 2: Créer la DB
    await createDatabase(client);
    console.log('');

    // Fermer la connexion postgres
    await client.end();

    // Étape 3: Initialiser la DB OverMind
    await initializeOvermindDb();

    console.log('');
    console.log('╔══════════════════════════════════════════════════════════════════╗');
    console.log('║  ✅ SETUP TERMINÉ AVEC SUCCÈS                                   ║');
    console.log('║                                                                ║');
    console.log('║  Prochaine étape:                                               ║');
    console.log('║  1. docker-compose -f docker-compose.overmind.yml up -d      ║');
    console.log('║  2. pnpm run build                                            ║');
    console.log('║  3. pnpm run dev                                              ║');
    console.log('╚══════════════════════════════════════════════════════════════════╝');

  } catch (error) {
    console.error('');
    console.error('╔══════════════════════════════════════════════════════════════════╗');
    console.error('║  ❌ ERREUR SETUP                                                  ║');
    console.error('╚══════════════════════════════════════════════════════════════════╝');
    console.error('');
    console.error('Erreur:', error.message);

    if (error.code === 'ECONNREFUSED') {
      console.error('');
      console.error('💡 Assurez-vous que PostgreSQL est démarré:');
      console.error('   docker ps | grep postgres-pgvector');
      console.error('');
      console.error('💡 Vérifiez les credentials dans .env:');
      console.error('   POSTGRES_HOST=' + DB_CONFIG.host);
      console.error('   POSTGRES_PORT=' + DB_CONFIG.port);
      console.error('   POSTGRES_USER=' + DB_CONFIG.user);
      console.error('   POSTGRES_PASSWORD=*** (votre mot de passe)');
    }

    process.exit(1);
  }
}

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

if (import.meta.url === `file://${process.argv[1]}`) {
  main();
}
