/**
 * Como ligar cada programa ao conector da Ktalogu.
 *
 * Só texto: recebe o endereço (e, no caminho da chave, a chave) e devolve o
 * que a pessoa copia e cola. Mora fora da tela para o teste ao lado conferir
 * cada formato, e não importa nada do servidor, para o navegador poder usar.
 *
 * São dois caminhos:
 *
 * - pelo botão Conectar: a pessoa cola o endereço no assistente, clica em
 *   Conectar, entra na tela da Ktalogu e permite. Nenhum segredo passa pela
 *   mão dela. É o caminho do Claude e do ChatGPT, e hoje também do Claude
 *   Code, do Codex e do Cursor;
 * - pela chave de acesso: para o programa que não tem o botão, ou para quem
 *   prefere. A chave nasce no painel e vai no cabeçalho `Authorization`.
 *
 * Formatos conferidos na documentação de cada programa (01/10 e 03/10/2026):
 * - Claude (site, aplicativo e celular): conector personalizado com o
 *   endereço; o botão Conectar abre a tela de permissão.
 * - ChatGPT: app com o endereço de um servidor MCP, criado pelo navegador.
 * - Claude Code: `claude mcp add --transport http <nome> <endereço>`, e o
 *   `/mcp` dentro dele para entrar; com chave, `--header`, ou a entrada
 *   `mcpServers.<nome>` com `type: "http"`, `url` e `headers` no `.mcp.json`.
 * - Codex: `codex mcp add <nome> --url <endereço>` e `codex mcp login <nome>`;
 *   com chave, o bloco `[mcp_servers.<nome>]` com `url` e `http_headers`.
 * - Cursor: `mcpServers.<nome>` com `url` no `mcp.json`, e Connect na tela de
 *   MCP; com chave, `headers` junto.
 */

/* Os programas do botão Conectar, na ordem em que aparecem: os dois que a
   maioria usa primeiro. */
export const PROGRAMAS = [
  { id: "claude", nome: "Claude" },
  { id: "chatgpt", nome: "ChatGPT" },
  { id: "claude-code", nome: "Claude Code" },
  { id: "codex", nome: "Codex" },
  { id: "cursor", nome: "Cursor" },
  /* Nome curto: as abas precisam caber numa coluna estreita. */
  { id: "outro", nome: "Outro" },
] as const;

export type Programa = (typeof PROGRAMAS)[number]["id"];

export type ProgramaDaChave = Exclude<Programa, "claude" | "chatgpt">;

/* Os que aceitam uma chave colada. O Claude e o ChatGPT não aceitam: para eles
   só existe o botão. */
export const PROGRAMAS_DA_CHAVE = [
  { id: "claude-code", nome: "Claude Code" },
  { id: "codex", nome: "Codex" },
  { id: "cursor", nome: "Cursor" },
  { id: "outro", nome: "Outro" },
] as const satisfies ReadonlyArray<{ id: ProgramaDaChave; nome: string }>;

export function aceitaChave(programa: Programa): programa is ProgramaDaChave {
  return programa !== "claude" && programa !== "chatgpt";
}

/** O que aparece no lugar da chave quando a pessoa ainda não tem uma em mãos. */
export const CHAVE_DE_EXEMPLO = "SUA_CHAVE";

/** O nome com que o conector aparece dentro do programa. */
const NOME_DO_CONECTOR = "ktalogu";

export type Instrucao = {
  passos: string[];
  /* O que a pessoa copia. */
  trecho: string;
  /* Um segundo caminho no mesmo programa, para quem não usa o primeiro. Sem
     trecho, é só orientação. */
  outroJeito?: { chamada: string; passos: string[]; trecho?: string };
  /* Uma observação curta embaixo (planos em que funciona, por exemplo). */
  nota?: string;
};

const JUNTO_DOS_DEMAIS = "Se o arquivo já tiver outros conectores, coloque só a parte “ktalogu” junto dos demais.";

/* O que acontece depois de clicar em Conectar, igual em todo programa. */
const NA_TELA_DA_KTALOGU = "Abre a tela da Ktalogu: entre com a sua conta, escolha o que o assistente pode fazer e clique em Permitir.";

const PREFERE_CHAVE = {
  chamada: "Prefere usar uma chave de acesso?",
  passos: ["Clique em Nova chave, no alto desta página.", "Depois de criar, a própria janela mostra o que colar, já com a chave."],
};

/** Pelo botão Conectar: sem chave. */
export function comoConectar(programa: Programa, endereco: string): Instrucao {
  if (programa === "claude") {
    return {
      passos: [
        "Copie o endereço do conector.",
        "No Claude (no site claude.ai ou no aplicativo do computador), abra a área de Conectores e escolha adicionar um conector personalizado.",
        "Dê o nome Ktalogu, cole o endereço e adicione.",
        `Clique em Conectar. ${NA_TELA_DA_KTALOGU}`,
        "Numa conversa, ligue a Ktalogu no botão + e peça: “Como está o meu dia?”",
      ],
      trecho: endereco,
      nota: "No celular o conector aparece sozinho depois de adicionado no site ou no computador. No plano gratuito do Claude cabe um conector personalizado; nos planos Team e Enterprise, quem adiciona é o administrador da organização.",
    };
  }

  if (programa === "chatgpt") {
    return {
      passos: [
        "Copie o endereço do conector.",
        "No ChatGPT, pelo navegador (chatgpt.com), abra a área de Apps e crie um app novo com o endereço de um servidor MCP.",
        "Dê o nome Ktalogu, cole o endereço no campo de conexão e crie.",
        `Clique em Conectar. ${NA_TELA_DA_KTALOGU}`,
        "Numa conversa, escolha a Ktalogu e peça: “Como está o meu dia?”",
      ],
      trecho: endereco,
      nota: "Funciona nos planos Plus, Pro, Business, Enterprise e Edu. Se a opção de criar o app não aparecer, ligue o Modo de desenvolvedor nas configurações do ChatGPT.",
    };
  }

  if (programa === "claude-code") {
    return {
      passos: [
        "Abra o terminal do computador (no Windows, o PowerShell), cole o comando abaixo e aperte Enter.",
        "Abra o Claude Code, digite /mcp, escolha ktalogu e depois Authenticate.",
        NA_TELA_DA_KTALOGU,
        "Volte ao Claude Code e peça: “Como está o meu dia na Ktalogu?”",
      ],
      /* `--scope user`: o conector vale em qualquer pasta em que a pessoa abrir
         o Claude Code, e não só na pasta em que o comando rodou. */
      trecho: `claude mcp add --transport http --scope user ${NOME_DO_CONECTOR} ${endereco}`,
      outroJeito: {
        chamada: "Usa o Claude Code pelo aplicativo, sem terminal?",
        passos: [
          "Pelo aplicativo, o caminho seguro é a chave de acesso: clique em Nova chave, no alto desta página.",
          "Depois de criar, escolha Claude Code na janela e siga o jeito do aplicativo, que já sai com a chave.",
        ],
      },
    };
  }

  if (programa === "codex") {
    return {
      passos: [
        "Abra o terminal do computador e cole o primeiro comando abaixo.",
        "Depois cole o segundo. Ele abre o navegador na tela da Ktalogu: entre com a sua conta, escolha o que o Codex pode fazer e clique em Permitir.",
        "Abra o Codex e peça: “Como está o meu dia na Ktalogu?”",
      ],
      trecho: [`codex mcp add ${NOME_DO_CONECTOR} --url ${endereco}`, `codex mcp login ${NOME_DO_CONECTOR}`].join("\n"),
      outroJeito: PREFERE_CHAVE,
    };
  }

  if (programa === "cursor") {
    return {
      passos: [
        "No Cursor, abra Settings, entre em MCP e escolha adicionar um conector novo. Ele abre o arquivo mcp.json.",
        `Cole o bloco abaixo e salve. ${JUNTO_DOS_DEMAIS}`,
        `Na lista de conectores, clique em Connect ao lado da Ktalogu. ${NA_TELA_DA_KTALOGU}`,
      ],
      trecho: JSON.stringify({ mcpServers: { [NOME_DO_CONECTOR]: { url: endereco } } }, null, 2),
      outroJeito: PREFERE_CHAVE,
    };
  }

  return {
    passos: [
      "Serve qualquer programa que aceite um conector MCP por endereço (HTTP).",
      "Cole o endereço do conector na tela de conectores do programa.",
      `Se ele tiver um botão para conectar ou entrar, clique. ${NA_TELA_DA_KTALOGU}`,
    ],
    trecho: endereco,
    outroJeito: {
      chamada: "O programa pede uma chave ou um cabeçalho?",
      passos: ["Clique em Nova chave, no alto desta página.", "Depois de criar, escolha Outro na janela: ela mostra o cabeçalho pronto, já com a chave."],
    },
  };
}

/** Pela chave de acesso: para os programas que aceitam uma chave colada. */
export function comoConectarComChave(programa: ProgramaDaChave, endereco: string, chave: string = CHAVE_DE_EXEMPLO): Instrucao {
  const cabecalho = `Bearer ${chave}`;

  if (programa === "claude-code") {
    return {
      passos: [
        "Abra o terminal do computador (no Windows, o PowerShell).",
        "Cole o comando abaixo e aperte Enter.",
        "Abra o Claude Code e peça: “Como está o meu dia na Ktalogu?”",
      ],
      trecho: `claude mcp add --transport http --scope user ${NOME_DO_CONECTOR} ${endereco} --header "Authorization: ${cabecalho}"`,
      /* Quem usa o Claude Code por dentro do aplicativo não tem o comando
         `claude` no terminal. O mesmo conector entra pelo arquivo do projeto. */
      outroJeito: {
        chamada: "Usa o Claude Code pelo aplicativo, sem terminal?",
        passos: [
          "Abra o arquivo .mcp.json na pasta do seu projeto. Se ele não existir, crie.",
          `Cole o bloco abaixo e salve. ${JUNTO_DOS_DEMAIS}`,
          "Comece uma conversa nova no Claude Code.",
          "Esse arquivo passa a guardar a sua chave: não envie para o GitHub nem mande para ninguém.",
        ],
        trecho: JSON.stringify(
          { mcpServers: { [NOME_DO_CONECTOR]: { type: "http", url: endereco, headers: { Authorization: cabecalho } } } },
          null,
          2
        ),
      },
    };
  }

  if (programa === "codex") {
    return {
      passos: [
        "Abra o arquivo config.toml, que fica na pasta .codex dentro da sua pasta de usuário.",
        "Cole o bloco abaixo no fim do arquivo e salve.",
        "Feche e abra o Codex de novo.",
      ],
      trecho: [`[mcp_servers.${NOME_DO_CONECTOR}]`, `url = "${endereco}"`, `http_headers = { "Authorization" = "${cabecalho}" }`].join("\n"),
    };
  }

  if (programa === "cursor") {
    return {
      passos: [
        "No Cursor, abra Settings, entre em MCP e escolha adicionar um conector novo. Ele abre o arquivo mcp.json.",
        `Cole o bloco abaixo e salve. ${JUNTO_DOS_DEMAIS}`,
        "Confira se a Ktalogu aparece ligada na lista.",
      ],
      trecho: JSON.stringify({ mcpServers: { [NOME_DO_CONECTOR]: { url: endereco, headers: { Authorization: cabecalho } } } }, null, 2),
    };
  }

  return {
    passos: [
      "Serve qualquer programa que aceite um conector MCP por endereço (HTTP).",
      "Na tela de conectores do programa, informe o endereço e o cabeçalho abaixo.",
    ],
    trecho: [`Endereço: ${endereco}`, `Cabeçalho: Authorization: ${cabecalho}`].join("\n"),
  };
}
