/* global window */
/* ============================================================
   data2.jsx — enriquecimento: traces, aprovações, alertas,
   orçamento/ROI, fallback, catálogo MCP, modelos, templates
   ============================================================ */
const D = window.AgentData;
const { AGENTS, LLMS } = D;

// ---------- campos extra por agente ----------
const EXTRA = {
  nf:          { budgetMonth: 4000, savedH: 48, fallback: "claude",  retries: 2, timeout: 30, infraCost: 0,   reqDay: 412 },
  concilia:    { budgetMonth: 5000, savedH: 31, fallback: "gpt-4o",  retries: 3, timeout: 45, infraCost: 0,   reqDay: 188 },
  triagem:     { budgetMonth: 1500, savedH: 27, fallback: "gpt-4o",  retries: 1, timeout: 60, infraCost: 0,   reqDay: 96 },
  contratos:   { budgetMonth: 800,  savedH: 19, fallback: "gpt-4o",  retries: 2, timeout: 30, infraCost: 0,   reqDay: 58 },
  atendimento: { budgetMonth: 700,  savedH: 62, fallback: "gpt-4o",  retries: 2, timeout: 20, infraCost: 420, reqDay: 1287 },
};
AGENTS.forEach((a) => Object.assign(a, EXTRA[a.id]));

const HOURLY_RATE = 90; // R$/h de um analista (custo carregado)

// ---------- TRACES (execução passo a passo) ----------
const st = (t, label, opt = {}) => ({ t, label, status: "ok", ...opt });
const TRACES = {
  nf: [
    st("trigger", "Gatilho recebido", { detail: "Webhook · e-mail fiscal — lote 04/2026 (38 anexos)", dur: "40 ms" }),
    st("tool", "OCR Documentos", { detail: "Extração OCR de 38 PDFs", mcp: "OCR Documentos", dur: "1,10 s", io: "38 documentos → texto estruturado" }),
    st("llm", "Estruturação fiscal-v3", { detail: "Extração de campos + classificação", model: "gpt-4o", tokIn: 28400, tokOut: 9200, dur: "0,90 s" }),
    st("tool", "SEFAZ · NF-e", { detail: "Validação de 38 chaves de acesso", mcp: "SEFAZ · NF-e", dur: "320 ms", io: "37 válidas · 1 descartada" }),
    st("decision", "Divergência de imposto?", { detail: "Tolerância R$ 0,01 — 0 divergências", dur: "8 ms" }),
    st("tool", "TOTVS Protheus", { detail: "Gravação de 37 lançamentos", mcp: "TOTVS Protheus", dur: "210 ms" }),
    st("output", "Resultado emitido", { detail: "JSON fiscal-v3 · 37 documentos conciliáveis", dur: "12 ms" }),
  ],
  concilia: [
    st("trigger", "Gatilho recebido", { detail: "Pipeline · NF concluída (Cliente Marília SA)", dur: "30 ms" }),
    st("tool", "TOTVS Protheus", { detail: "Leitura de 312 lançamentos", mcp: "TOTVS Protheus", dur: "240 ms" }),
    st("tool", "Open Finance", { detail: "Extrato de 3 contas bancárias", mcp: "Open Finance", dur: "1,80 s", status: "warn", io: "provedor lento · acima do limite de 1,0 s" }),
    st("llm", "Match valor + data + descrição", { detail: "Conciliação assistida", model: "claude", tokIn: 14200, tokOut: 4200, dur: "1,30 s" }),
    st("decision", "Valor acima de R$ 10k?", { detail: "6 itens → encaminhados para revisão humana", dur: "10 ms", status: "warn" }),
    st("output", "Resultado emitido", { detail: "47 conciliados · 6 pendentes de aprovação", dur: "14 ms", status: "warn" }),
  ],
  triagem: [
    st("trigger", "Gatilho recebido", { detail: "ATS · vaga publicada (Analista Contábil Pleno)", dur: "26 ms" }),
    st("tool", "Parser de CV", { detail: "Parse de 62 currículos", mcp: "Parser de CV", dur: "140 ms" }),
    st("tool", "Banco de Vagas", { detail: "Cruzamento com requisitos da vaga", mcp: "Banco de Vagas", dur: "110 ms" }),
    st("llm", "Pontuação de aderência", { detail: "Score 0–100 anti-viés por critério", model: "gemini", tokIn: 98000, tokOut: 26000, dur: "5,00 s" }),
    st("output", "Resultado emitido", { detail: "Ranking de 62 candidatos · 8 recomendados", dur: "18 ms" }),
  ],
  contratos: [
    st("trigger", "Gatilho recebido", { detail: "Pipeline · Candidato aprovado (M. Andrade)", dur: "22 ms" }),
    st("tool", "Templates Jurídicos", { detail: "Seleção do template CLT", mcp: "Templates Jurídicos", dur: "70 ms" }),
    st("llm", "Preenchimento + cláusulas", { detail: "Partes, objeto, prazo, remuneração, LGPD", model: "deepseek", tokIn: 6100, tokOut: 2500, dur: "2,90 s" }),
    st("decision", "Revisão humana obrigatória", { detail: "Aguardando liberação antes de assinar", dur: "—", status: "warn" }),
    st("tool", "Assinatura Digital", { detail: "Envio (após aprovação)", mcp: "Assinatura Digital", dur: "260 ms" }),
    st("output", "Resultado emitido", { detail: "Minuta + checklist de 12 cláusulas", dur: "11 ms" }),
  ],
  atendimento: [
    st("trigger", "Gatilho recebido", { detail: "WhatsApp · mensagem recebida (cliente)", dur: "18 ms" }),
    st("tool", "WhatsApp API", { detail: "Autenticação do webhook", mcp: "WhatsApp API", dur: "—", status: "error", io: "Token expirado (HTTP 401) — handshake recusado" }),
    st("blocked", "Base de Conhecimento", { detail: "Não executado — bloqueado pela falha anterior", dur: "—", status: "blocked" }),
    st("blocked", "Geração da resposta", { detail: "Não executado", dur: "—", status: "blocked" }),
    st("output", "Execução interrompida", { detail: "Fila represada (34 mensagens) · fallback acionado", dur: "—", status: "error" }),
  ],
};

// ---------- APROVAÇÕES (human-in-the-loop) ----------
const APPROVALS = [
  { id: "AP-3391", agentId: "concilia", type: "Conciliação acima do teto", subject: "Cliente Marília SA", value: 18450.0, risk: "alto", time: "há 6 min",
    summary: "6 lançamentos somando R$ 18.450,00 ultrapassam o teto de R$ 10.000 e exigem liberação manual.",
    fields: [["Lançamentos", "6 itens"], ["Conta sugerida", "1.1.02 · Bancos"], ["Confiança do agente", "91%"], ["Janela", "abril/2026"]] },
  { id: "AP-3390", agentId: "contratos", type: "Contrato para assinatura", subject: "M. Andrade · CLT", value: 4200.0, risk: "médio", time: "há 4 min",
    summary: "Minuta CLT gerada com 12 cláusulas. Requer liberação humana antes do envio para assinatura digital.",
    fields: [["Modalidade", "CLT"], ["Remuneração", "R$ 4.200,00"], ["Cláusulas", "12 · LGPD ok"], ["Template", "v5"]] },
  { id: "AP-3389", agentId: "atendimento", type: "Resposta sensível ao cliente", subject: "Chamado #4821 · DAS atrasado", value: null, risk: "médio", time: "há 12 min",
    summary: "Tema fiscal sensível. A política exige validação de um contador humano antes do envio da resposta.",
    fields: [["Canal", "WhatsApp"], ["Tema", "DAS em atraso"], ["Sugestão do agente", "Parcelamento"], ["Escalado p/", "Contador"]] },
  { id: "AP-3388", agentId: "triagem", type: "Desempate de candidatos", subject: "Vaga Analista Pleno", value: null, risk: "baixo", time: "há 20 min",
    summary: "Dois candidatos com score idêntico (88/100). Desempate humano sugerido antes de avançar.",
    fields: [["Candidatos", "2 empatados"], ["Score", "88 / 100"], ["Vaga", "Analista Pleno"]] },
  { id: "AP-3387", agentId: "contratos", type: "Aditivo de prazo", subject: "Consultoria ABC", value: null, risk: "baixo", time: "há 26 min",
    summary: "Aditivo de prazo gerado automaticamente. Liberação de baixo risco.",
    fields: [["Tipo", "Aditivo"], ["Prazo", "+12 meses"], ["Partes", "2"]] },
];

// ---------- ALERTAS / INCIDENTES ----------
const ALERTS = [
  { id: "AL-9001", sev: "critical", agentId: "atendimento", mcp: "WhatsApp API", title: "WhatsApp API offline", time: "há 1 min", status: "open",
    detail: "Token de acesso expirado (HTTP 401). 34 mensagens represadas na fila. Fallback de canal não configurado." },
  { id: "AL-9000", sev: "critical", agentId: "atendimento", title: "Inferência local saturada", time: "há 40 min", status: "open",
    detail: "Fila do modelo Llama 3.1 (on-premise) acima de 80% da capacidade de GPU." },
  { id: "AL-8998", sev: "warning", agentId: "concilia", mcp: "Open Finance", title: "Open Finance degradado", time: "há 18 min", status: "open",
    detail: "Latência p95 em 1,8 s (limite de SLA 1,0 s) há 22 minutos." },
  { id: "AL-8997", sev: "warning", agentId: "concilia", title: "Taxa de sucesso abaixo da meta", time: "há 31 min", status: "ack",
    detail: "Taxa de sucesso em 96,4%, abaixo da meta de 98%." },
  { id: "AL-8995", sev: "info", agentId: "nf", title: "Pico de volume", time: "há 1 h", status: "open",
    detail: "412 acionamentos hoje, +38% acima da média móvel de 7 dias." },
  { id: "AL-8990", sev: "info", agentId: "contratos", title: "Nova versão de prompt publicada", time: "há 2 h", status: "resolved",
    detail: "Prompt promovido para v5 por Bruno Lima (cláusula LGPD)." },
];
const SEV = {
  critical: { label: "Crítico", fg: "#b91c1c", bg: "#fef2f2", orb: "#ef4444", icon: "alert-triangle" },
  warning: { label: "Atenção", fg: "#92400e", bg: "#fffbeb", orb: "#e0a800", icon: "alert-triangle" },
  info: { label: "Info", fg: "#7ea3cc", bg: "#e6f4f5", orb: "#8fb3d4", icon: "bell" },
};
const RISK = {
  alto: { label: "Risco alto", fg: "#b91c1c", bg: "#fef2f2", orb: "#ef4444" },
  "médio": { label: "Risco médio", fg: "#92400e", bg: "#fffbeb", orb: "#e0a800" },
  baixo: { label: "Risco baixo", fg: "#15803d", bg: "#ecfdf3", orb: "#19b36b" },
};

// ---------- CATÁLOGO GLOBAL DE MCPs ----------
const MCP_RAW = [
  { name: "OCR Documentos", icon: "scan-line", cat: "Documentos", status: "ok", used: ["nf"], calls: 412, lat: "180 ms" },
  { name: "SEFAZ · NF-e", icon: "file-check", cat: "Fiscal", status: "ok", used: ["nf"], calls: 412, lat: "320 ms" },
  { name: "TOTVS Protheus", icon: "database", cat: "ERP", status: "ok", used: ["nf", "concilia"], calls: 600, lat: "225 ms" },
  { name: "Plano de Contas", icon: "book-open", cat: "Contábil", status: "ok", used: ["concilia"], calls: 188, lat: "90 ms" },
  { name: "Open Finance", icon: "landmark", cat: "Bancário", status: "warn", used: ["concilia"], calls: 188, lat: "1,80 s" },
  { name: "Parser de CV", icon: "file-text", cat: "RH", status: "ok", used: ["triagem"], calls: 96, lat: "140 ms" },
  { name: "ATS · LinkedIn", icon: "users", cat: "RH", status: "ok", used: ["triagem"], calls: 96, lat: "420 ms" },
  { name: "Banco de Vagas", icon: "briefcase", cat: "RH", status: "ok", used: ["triagem"], calls: 96, lat: "110 ms" },
  { name: "Templates Jurídicos", icon: "file-signature", cat: "Jurídico", status: "ok", used: ["contratos"], calls: 58, lat: "70 ms" },
  { name: "Assinatura Digital", icon: "pen-tool", cat: "Jurídico", status: "ok", used: ["contratos"], calls: 58, lat: "260 ms" },
  { name: "Cofre de Documentos", icon: "folder-lock", cat: "Documentos", status: "ok", used: ["contratos"], calls: 58, lat: "150 ms" },
  { name: "WhatsApp API", icon: "message-circle", cat: "Comunicação", status: "error", used: ["atendimento"], calls: 1287, lat: "—" },
  { name: "Base de Conhecimento", icon: "book-open", cat: "Conhecimento", status: "ok", used: ["atendimento"], calls: 1287, lat: "120 ms" },
  { name: "CRM", icon: "contact", cat: "CRM", status: "ok", used: ["atendimento"], calls: 1287, lat: "300 ms" },
  { name: "E-mail", icon: "mail", cat: "Comunicação", status: "ok", used: ["atendimento"], calls: 640, lat: "180 ms" },
];
// ---------- TOOLS por MCP (a "caixa de ferramentas") ----------
// Cada MCP é uma caixa; cada tool é uma chave/ferramenta que ela expõe aos agentes.
const TL = (fn, label) => ({ fn, label });
const MCP_TOOLS = {
  "OCR Documentos": [TL("extract_text", "Extrair texto de PDF e imagem"), TL("detect_type", "Identificar o tipo de documento"), TL("parse_tables", "Estruturar tabelas e itens"), TL("read_barcode", "Ler código de barras / chave")],
  "SEFAZ · NF-e": [TL("validate_key", "Validar chave de acesso (44 díg.)"), TL("query_status", "Consultar situação da NF-e"), TL("download_xml", "Baixar XML autorizado"), TL("check_cnpj", "Conferir CNPJ na Receita")],
  "TOTVS Protheus": [TL("post_entry", "Lançar no contábil / financeiro"), TL("query_invoice", "Consultar título e nota"), TL("update_inventory", "Atualizar estoque"), TL("get_accounts", "Ler o plano de contas"), TL("list_partners", "Listar fornecedores e clientes")],
  "Plano de Contas": [TL("lookup_account", "Localizar conta contábil"), TL("suggest_account", "Sugerir conta por histórico"), TL("list_hierarchy", "Listar a hierarquia de contas")],
  "Open Finance": [TL("list_accounts", "Listar contas conectadas"), TL("fetch_statement", "Puxar extrato bancário"), TL("get_balance", "Consultar saldo"), TL("consent_status", "Verificar consentimento")],
  "Parser de CV": [TL("parse_resume", "Ler e estruturar o currículo"), TL("extract_skills", "Extrair competências"), TL("extract_experience", "Mapear experiência"), TL("normalize_education", "Normalizar formação")],
  "ATS · LinkedIn": [TL("search_candidates", "Buscar candidatos"), TL("fetch_profile", "Obter perfil completo"), TL("post_job", "Publicar vaga"), TL("get_applications", "Listar candidaturas")],
  "Banco de Vagas": [TL("list_openings", "Listar vagas abertas"), TL("get_requirements", "Ler requisitos da vaga"), TL("match_candidate", "Cruzar candidato × vaga")],
  "Templates Jurídicos": [TL("get_template", "Selecionar o template"), TL("fill_clauses", "Preencher cláusulas"), TL("clause_library", "Consultar biblioteca de cláusulas"), TL("apply_policy", "Aplicar política vigente")],
  "Assinatura Digital": [TL("create_envelope", "Montar envelope de assinatura"), TL("send_signature", "Enviar para assinatura"), TL("check_status", "Acompanhar status"), TL("download_signed", "Baixar documento assinado")],
  "Cofre de Documentos": [TL("store_doc", "Guardar documento"), TL("retrieve_doc", "Recuperar documento"), TL("set_permissions", "Definir permissões"), TL("version_history", "Ver histórico de versões")],
  "WhatsApp API": [TL("send_message", "Enviar mensagem"), TL("send_template", "Disparar template aprovado"), TL("read_inbox", "Ler mensagens recebidas"), TL("mark_read", "Marcar como lida")],
  "Base de Conhecimento": [TL("search_kb", "Buscar na base"), TL("get_article", "Abrir artigo"), TL("semantic_query", "Consulta semântica (RAG)")],
  "CRM": [TL("get_contact", "Buscar contato"), TL("create_ticket", "Abrir chamado"), TL("log_interaction", "Registrar interação"), TL("update_deal", "Atualizar negócio")],
  "E-mail": [TL("send_email", "Enviar e-mail"), TL("read_inbox", "Ler caixa de entrada"), TL("create_draft", "Criar rascunho")],
};
MCP_RAW.forEach((m) => { m.tools = MCP_TOOLS[m.name] || []; });

const MCP_AVAILABLE = [
  { name: "Receita Federal", icon: "landmark", cat: "Fiscal" },
  { name: "Banco Central · PIX", icon: "landmark", cat: "Bancário" },
  { name: "Google Drive", icon: "folder-lock", cat: "Documentos" },
  { name: "Slack", icon: "message-circle", cat: "Comunicação" },
];

// ---------- TEMPLATES (novo agente) ----------
const TEMPLATES = [
  { id: "doc", name: "Classificação de Documentos", icon: "scan-line", desc: "OCR + extração e categorização de qualquer documento recebido.", llm: "gpt-4o", mcps: ["OCR Documentos", "Cofre de Documentos"] },
  { id: "cobranca", name: "Cobrança & Inadimplência", icon: "dollar-sign", desc: "Detecta atrasos, gera régua de cobrança e dispara lembretes.", llm: "deepseek", mcps: ["TOTVS Protheus", "WhatsApp API", "E-mail"] },
  { id: "onboarding", name: "Onboarding de Clientes", icon: "users", desc: "Coleta documentos, valida cadastro e abre a conta do cliente.", llm: "gemini", mcps: ["Receita Federal", "Cofre de Documentos", "CRM"] },
  { id: "contratos", name: "Análise de Contratos", icon: "file-signature", desc: "Lê contratos, extrai cláusulas de risco e resume obrigações.", llm: "claude", mcps: ["Templates Jurídicos", "Cofre de Documentos"] },
  { id: "relatorios", name: "Relatórios Gerenciais", icon: "activity", desc: "Consolida dados e gera relatórios executivos sob demanda.", llm: "gpt-4o", mcps: ["TOTVS Protheus", "Plano de Contas"] },
  { id: "blank", name: "Agente em branco", icon: "plus", desc: "Comece do zero e componha as tools manualmente.", llm: "gpt-4o", mcps: [] },
];

const ENVIRONMENTS = [
  { id: "teste", label: "Base Teste", color: "#d92d20", note: "Sandbox · dados de homologação" },
  { id: "prod", label: "Produção", color: "#15803d", note: "Ambiente produtivo · clientes reais" },
];

// ---------- fleet de modelos (derivado) ----------
function modelFleet() {
  return D.LLM_LIST.map((id) => {
    const l = LLMS[id];
    const used = AGENTS.filter((a) => a.llm === id);
    const fb = AGENTS.filter((a) => a.fallback === id);
    return {
      ...l,
      agents: used.map((a) => a.id),
      fallbackFor: fb.map((a) => a.id),
      tokens: used.reduce((s, a) => s + a.metrics.tokensDay, 0),
      cost: used.reduce((s, a) => s + a.metrics.cost, 0),
      calls: used.reduce((s, a) => s + a.metrics.calls, 0),
    };
  });
}

// ---------- credenciais / segredos de conexão por MCP ----------
function credsFor(mcp) {
  const N = mcp.name;
  const F = (key, label, kind, value) => ({ key, label, kind, value });
  let type = "API Key", doc = "—", rotated = "há 34 dias", fields;
  switch (N) {
    case "WhatsApp API":
      type = "Meta Cloud API"; doc = "developers.facebook.com"; rotated = "há 92 dias · expirado";
      fields = [F("phone", "Phone Number ID", "text", "109842317756432"), F("token", "Permanent Access Token", "secret", "EAAGm0PX4ZBsBO7ZCx9ZBQ2ZD8kZBv1pZC"), F("verify", "Verify Token", "secret", "nnstudio_wpp_2026_vfy")];
      break;
    case "ATS · LinkedIn":
      type = "OAuth 2.0"; doc = "linkedin.com/developers";
      fields = [F("cid", "Client ID", "text", "86xk2p9qz1ab"), F("cs", "Client Secret", "secret", "WPL_AP1.x9KdQ2m7sQ"), F("at", "Access Token", "secret", "AQXd8f2afT2akP9c"), F("rt", "Refresh Token", "secret", "AQW9x1k0LpZ4")];
      break;
    case "TOTVS Protheus":
      type = "API REST · Protheus"; doc = "tdn.totvs.com"; rotated = "há 7 dias";
      fields = [F("base", "Base URL (REST)", "text", "https://protheus.nnstudio.io:8088/rest"), F("user", "Usuário de integração", "text", "INT_AGENTES"), F("token", "OAuth2 Access Token", "secret", "eyJhbGciOiJIUzI1NiIsInR5cCI6")];
      break;
    case "Open Finance":
      type = "mTLS + OAuth"; doc = "openfinancebrasil.org.br"; rotated = "há 61 dias";
      fields = [F("cid", "Client ID", "text", "of-nnstudio-001"), F("cs", "Client Secret", "secret", "of_sk_4f9c8b2a7e1d"), F("cert", "Certificado mTLS", "text", "nnstudio-of.pem")];
      break;
    case "SEFAZ · NF-e":
      type = "Certificado A1"; doc = "—"; rotated = "há 120 dias · renovar";
      fields = [F("cert", "Certificado A1", "text", "nnstudio-a1.pfx"), F("pwd", "Senha do certificado", "secret", "NNstudio2026")];
      break;
    case "Assinatura Digital":
      type = "API Key"; doc = "clicksign.com"; rotated = "há 22 dias";
      fields = [F("key", "API Token", "secret", "lk_prod_9d3f7a2c8b41"), F("env", "Ambiente", "text", "production")];
      break;
    default:
      type = "API Key"; rotated = "há 18 dias";
      fields = [F("ep", "Endpoint", "text", "https://api.nnstudio.io/" + N.toLowerCase().replace(/[^a-z]+/g, "-")), F("key", "API Key", "secret", "sk_live_4f9c8b2a7e1d6034a5b9"), F("org", "Organização", "text", "nnstudio-core")];
  }
  return { type, doc, rotated, enc: "AES-256 · cofre NN.ai", fields };
}

Object.assign(window.AgentData, {
  TRACES, APPROVALS, ALERTS, SEV, RISK, MCP_RAW, MCP_AVAILABLE, TEMPLATES, ENVIRONMENTS, HOURLY_RATE, modelFleet, credsFor,
});
