#!/usr/bin/env node
/**
 * ═══════════════════════════════════════════════════════════════════════════════
 * UNINSTALL SCRIPT — OverMind-MCP
 * ═══════════════════════════════════════════════════════════════════════════════
 * Désinstallation propre : supprime containers, volumes, images, config.
 *
 * Usage:
 *   overmind uninstall          # interactif (recommandé)
 *   overmind uninstall --force  # skip prompts,Tout supprime
 * ═══════════════════════════════════════════════════════════════════════════════
 */

import { execSync } from 'child_process';
import { existsSync, rmSync } from 'fs';
import { join, dirname } from 'path';
import { fileURLToPath } from 'url';
import { createInterface } from 'readline';

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

const INSTALL_DIR = join(process.env.HOME || process.env.USERPROFILE || process.env.HOMEPATH, '.overmind');
const FORCE = process.argv.includes('--force');

// ─────────────────────────────────────────────────────────────────────────────
// UTILS
// ─────────────────────────────────────────────────────────────────────────────

function p(prompt) {
  return new Promise((resolve) => {
    const rl = createInterface({ input: process.stdin, output: process.stdout });
    rl.question(prompt, (answer) => { rl.close(); resolve(answer); });
  });
}

async function yesNo(question, def = false) {
  const answer = await p(`${question} ${def ? '[Y/n]' : '[y/N]'}: `);
  return answer.toLowerCase().startsWith('y');
}

function log(msg) { console.log(msg); }
function section(title) {
  console.log(`\n╔${'═'.repeat(68)}╗`);
  console.log(`║  ${title.padEnd(66)} ║`);
  console.log(`╚${'═'.repeat(68)}╝`);
}

function cmd(command, label) {
  try {
    execSync(command, { stdio: 'pipe' });
    log(`✅ ${label}`);
    return true;
  } catch (e) {
    const msg = e.message || '';
    if (msg.includes('No such container') || msg.includes('no such container')) {
      log(`⚠️  ${label} (déjà absent)`);
    } else if (msg.includes('No such volume')) {
      log(`⚠️  ${label} (volume déjà absent)`);
    } else {
      log(`❌ ${label} — ${msg.split('\n')[0]}`);
    }
    return false;
  }
}

// ─────────────────────────────────────────────────────────────────────────────
// DETECTION & LISTING
// ─────────────────────────────────────────────────────────────────────────────

function listContainers() {
  // ⚠️ CORRECTION CRITIQUE: Ne cibler que les containers OverMind, pas les containers personnels
  // Les containers personnels comme "postgres-pgvector" ne doivent JAMAIS être supprimés
  const overmindContainers = [
    'overmind-postgres-pgvector',     // Container créé par OverMind 2.2.0+
  ];

  return overmindContainers.filter((containerName) => {
    try {
      execSync(`docker inspect ${containerName}`, { stdio: 'pipe' });
      return true;
    } catch { return false; }
  });
}

function listVolumes() {
  // ⚠️ CORRECTION CRITIQUE: Ne cibler que les volumes OverMind, pas les volumes personnels
  const overmindVolumes = [
    'overmind_postgres_data',
  ];

  return overmindVolumes.filter((volumeName) => {
    try {
      execSync(`docker volume inspect ${volumeName}`, { stdio: 'pipe' });
      return true;
    } catch { return false; }
  });
}

function listImages() {
  const imgs = ['pgvector/pgvector:pg16'];
  return imgs.filter((img) => {
    try {
      execSync(`docker image inspect ${img}`, { stdio: 'pipe' });
      return true;
    } catch { return false; }
  });
}

// ─────────────────────────────────────────────────────────────────────────────
// MAIN
// ─────────────────────────────────────────────────────────────────────────────

async function main() {
  console.log(`\n╔${'═'.repeat(68)}╗`);
  console.log(`║                                                                ║`);
  console.log(`║      🧹 OVERMIND-MCP — DÉSINSTALLATION PROPRE                  ║`);
  console.log(`║                                                                ║`);
  console.log(`╚${'═'.repeat(68)}╝`);

  // ⚠️ AVERTISSEMENT DE SÉCURITÉ
  console.log('\n⚠️  SÉCURITÉ: Ce script ne supprime QUE les containers/volumes OverMind.');
  console.log('   Vos containers personnels (comme postgres-pgvector) sont PROTÉGÉS.');
  console.log('   Seuls les containers commençant par "overmind-" seront supprimés.\n');

  // ── 1. Containers actifs ──────────────────────────────────────────────
  const containers = listContainers();
  const volumes = listVolumes();
  const images = listImages();
  const hasInstallDir = existsSync(INSTALL_DIR);

  if (!containers.length && !volumes.length && !images.length && !hasInstallDir) {
    log('\n✅ OverMind-MCP ne laisse aucune trace détectable.');
    log('   Supprimez le package manuellement :\n   npm uninstall -g overmind-mcp\n');
    return;
  }

  log('\n📋 Éléments OverMind détectés sur cette machine :\n');

  if (containers.length) {
    log('  Containers :');
    containers.forEach((c) => log(`    - ${c}`));
  } else {
    log('  Containers : aucun');
  }

  if (volumes.length) {
    log('  Volumes Docker :');
    volumes.forEach((v) => log(`    - ${v}`));
  } else {
    log('  Volumes Docker : aucun');
  }

  if (images.length) {
    log('  Images Docker (↺ réutilisables) :');
    images.forEach((i) => log(`    - ${i}`));
  } else {
    log('  Images Docker : aucune');
  }

  if (hasInstallDir) {
    log(`  Config ~/.overmind/ : présent`);
  } else {
    log('  Config ~/.overmind/ : absent');
  }

  if (FORCE) {
    log('\n⚠️  Mode --force : suppression sans confirmation.\n');
  } else {
    log('\n⏳ Les données des volumes Docker seront DÉTRUITES.\n');
    const confirm = await yesNo('Procéder à la désinstallation ?');
    if (!confirm) { log('\n🛑 Annulé.'); return; }
  }

  // ── 2. Stop & remove containers ───────────────────────────────────────
  section('SUPPRESSION CONTENEURS');
  for (const c of containers) {
    cmd(`docker stop ${c}`, `Stop ${c}`);
    cmd(`docker rm -f ${c}`, `Remove ${c}`);
  }

  // ── 3. Remove volumes ─────────────────────────────────────────────────
  if (FORCE || await yesNo('\n🗑️  Supprimer les volumes Docker (DESTRUCTIF) ?')) {
    section('SUPPRESSION VOLUMES');
    for (const v of volumes) {
      cmd(`docker volume rm ${v}`, `Remove volume ${v}`);
    }
  } else {
    log('\n⚠️  Volumes conservés (données PostgreSQL intactes).');
  }

  // ── 4. Remove images ────────────────────────────────────────────────────
  if (FORCE || await yesNo('\n🗑️  Supprimer les images OverMind Docker (~3-4 GB) ?')) {
    section('SUPPRESSION IMAGES');
    for (const img of images) {
      cmd(`docker rmi ${img}`, `Remove image ${img}`);
    }
  } else {
    log('\n⚠️  Images conservées.');
  }

  // ── 5. Remove ~/.overmind ──────────────────────────────────────────────
  if (FORCE || await yesNo('\n📁 Supprimer ~/.overmind/ (config + .env avec credentials) ?')) {
    section('SUPPRESSION CONFIG');
    if (existsSync(INSTALL_DIR)) {
      try {
        rmSync(INSTALL_DIR, { recursive: true, force: true });
        log(`✅ ~/.overmind/ supprimé`);
      } catch (e) {
        log(`❌ ~/.overmind/ : ${e.message.split('\n')[0]}`);
      }
    } else {
      log('⚠️  ~/.overmind/ déjà absent');
    }
  } else {
    log('\n⚠️  Config ~/.overmind/ conservée.');
  }

  // ── Done ───────────────────────────────────────────────────────────────
  section('DÉSINSTALLATION TERMINÉE');
  console.log(`
✅ OverMind-MCP a été retiré proprement.

📋 Pour désinstaller complètement le package NPM :
   npm uninstall -g overmind-mcp

💡 Si vous réinstallez plus tard :
   npm install -g overmind-mcp
   overmind-setup --full    # (si vous voulez le Mode Avancé)

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

main().catch((e) => {
  console.error('\n❌ ERREUR FATALE:', e.message);
  process.exit(1);
});
