// Extension minima de VS Code para SiPi: su unico trabajo es encontrar
// 'sipi_lsp.py' y levantarlo como servidor de lenguaje via stdio. Toda
// la logica real (diagnosticos, autocompletado) vive en sipi_lsp.py,
// que es puro Python estandar -- esta extension es solo el "cable" que
// lo conecta a VS Code, siguiendo el mismo protocolo LSP que usan
// pyright, rust-analyzer, etc.
const path = require("path");
const fs = require("fs");
const { workspace, window } = require("vscode");
const { LanguageClient, TransportKind } = require("vscode-languageclient/node");

let cliente;

function encontrarServidorLSP() {
  const config = workspace.getConfiguration("sipi");
  const rutaConfigurada = config.get("lspPath");
  if (rutaConfigurada && fs.existsSync(rutaConfigurada)) {
    return rutaConfigurada;
  }
  const carpetas = workspace.workspaceFolders || [];
  for (const carpeta of carpetas) {
    const candidata = path.join(carpeta.uri.fsPath, "sipi_lsp.py");
    if (fs.existsSync(candidata)) return candidata;
    // busqueda superficial en subcarpetas comunes (src/, sipi/)
    for (const sub of ["src", "sipi"]) {
      const candidata2 = path.join(carpeta.uri.fsPath, sub, "sipi_lsp.py");
      if (fs.existsSync(candidata2)) return candidata2;
    }
  }
  return null;
}

function activate(context) {
  const rutaServidor = encontrarServidorLSP();
  if (!rutaServidor) {
    window.showWarningMessage(
      "SiPi: no se encontro 'sipi_lsp.py' en el proyecto abierto. " +
      "Configura 'sipi.lspPath' en Preferencias para apuntarlo manualmente."
    );
    return;
  }

  const pythonPath = workspace.getConfiguration("sipi").get("pythonPath") || "python3";

  const opcionesServidor = {
    command: pythonPath,
    args: [rutaServidor],
    transport: TransportKind.stdio,
  };

  const opcionesCliente = {
    documentSelector: [{ scheme: "file", language: "sipi" }],
  };

  cliente = new LanguageClient(
    "sipiLanguageServer",
    "Servidor de lenguaje SiPi",
    opcionesServidor,
    opcionesCliente
  );

  context.subscriptions.push(cliente.start());
}

function deactivate() {
  if (!cliente) return undefined;
  return cliente.stop();
}

module.exports = { activate, deactivate };
