/**
 * Step 3 — Salvar .env e registrar MCP no Claude Code
 */

const fs = require("fs");
const path = require("path");
const os = require("os");
const { execSync } = require("child_process");
const { R, B, DIM, MUTED, TEAL, PURPLE } = require("../colors");
const { stepHeader, ok, warn, info, print } = require("../banner");

/**
 * Retorna o diretorio persistente para o .env do Fluig MCP.
 * Usa ~/.fluig-mcp/ para garantir que sobrevive a limpeza de cache do npx.
 */
function getEnvDir() {
  const fluigHome = path.join(os.homedir(), ".fluig-mcp");
  if (!fs.existsSync(fluigHome)) {
    fs.mkdirSync(fluigHome, { recursive: true });
  }
  return fluigHome;
}

/**
 * Encontra o diretorio mcp/ do pacote (para copiar .env la tambem).
 */
function encontrarMcp() {
  // 1. Relativo ao pacote (lib/wizard/steps/ -> raiz do pacote -> mcp/)
  const relativoAoPacote = path.join(__dirname, "..", "..", "..", "mcp");
  if (fs.existsSync(path.join(relativoAoPacote, "server.py"))) {
    return relativoAoPacote;
  }

  // 2. Diretorio atual tem mcp/
  const cwd = path.join(process.cwd(), "mcp");
  if (fs.existsSync(path.join(cwd, "server.py"))) {
    return cwd;
  }

  // 3. Diretorio atual tem server.py diretamente
  if (fs.existsSync(path.join(process.cwd(), "server.py"))) {
    return process.cwd();
  }

  return null;
}

async function saveConfig(config, pythonInfo) {
  const { default: inquirer } = await import("inquirer");

  stepHeader(4, 5, "Salvando configuracao");

  // Salvar .env no diretorio persistente (~/.fluig-mcp/)
  const envDir = getEnvDir();
  const envPath = path.join(envDir, ".env");

  const conteudo = Object.entries(config)
    .map(([k, v]) => `${k}=${v}`)
    .join("\n");

  fs.writeFileSync(envPath, conteudo + "\n", "utf-8");
  ok(`.env salvo em ${TEAL}${envPath}${R}`);

  // Tambem salvar no diretorio mcp/ do pacote (para uso local/dev)
  const mcpDir = encontrarMcp();
  if (mcpDir) {
    const envLocal = path.join(mcpDir, ".env");
    fs.writeFileSync(envLocal, conteudo + "\n", "utf-8");
    ok(`.env copiado para ${TEAL}${envLocal}${R}`);
  }

  // Registrar no Claude Code
  print("");

  const pythonCmd = pythonInfo ? pythonInfo.cmd : "python3";
  const serverPath = mcpDir
    ? path.resolve(mcpDir, "server.py")
    : path.resolve(__dirname, "..", "..", "..", "mcp", "server.py");

  // Comando principal: usa path direto para o server.py
  const mcpCommand = `claude mcp add fluig -- ${pythonCmd} "${serverPath}"`;

  const { registrar } = await inquirer.prompt([
    {
      type: "confirm",
      name: "registrar",
      message: "Registrar automaticamente no Claude Code?",
      default: true,
    },
  ]);

  if (registrar) {
    try {
      execSync(mcpCommand, {
        encoding: "utf8",
        timeout: 10000,
        stdio: "pipe",
      });
      ok("Registrado no Claude Code!");
    } catch (e) {
      const stderr = (e.stderr || "").toLowerCase();
      if (stderr.includes("already") || stderr.includes("exists")) {
        warn("MCP 'fluig' ja registrado (nao alterado)");
        info(`Para atualizar: claude mcp remove fluig && ${mcpCommand}`);
      } else {
        warn("Registro automatico falhou");
        info("Registre manualmente:");
      }
    }
  } else {
    info("Para registrar manualmente:");
  }

  print(`\n  ${MUTED}${mcpCommand}${R}\n`);

  return { envPath, serverPath, mcpCommand };
}

module.exports = { saveConfig };
