import type { SupabaseClient } from "@supabase/supabase-js";

/**
 * O registro do que os assistentes fazem.
 *
 * Uma linha por comando: quem (a chave), o quê (a ferramenta), se deu certo e
 * um resumo em português. É o que o dono lê na aba "Assistentes e Apps" para
 * saber o que aconteceu na conta dele, e o que permite revogar uma chave com
 * base em fato, não em desconfiança.
 *
 * O registro nunca atrasa nem derruba a resposta ao assistente: é gravado
 * depois, sem esperar, e uma falha aqui só vai para o log do servidor.
 *
 * Ele guarda seis meses. A tela mostra as últimas linhas, e um registro que só
 * cresce viraria peso no banco; de vez em quando, ao gravar uma linha nova, as
 * antigas daquela empresa são apagadas.
 */

const GUARDA_POR_MS = 180 * 24 * 60 * 60 * 1000;
/* Uma faxina a cada duzentas gravações, em média. */
const CHANCE_DE_FAXINA = 0.005;

export type LinhaDeAtividade = {
  companyId: string;
  chaveId: string;
  usuarioId: string;
  ferramenta: string;
  tipo: "leitura" | "previa" | "escrita";
  ok: boolean;
  resumo?: string | null;
  erro?: string | null;
  cliente?: string | null;
  duracaoMs?: number | null;
};

const curto = (valor: string | null | undefined, maximo: number) => {
  const texto = String(valor ?? "").trim();
  return texto ? texto.slice(0, maximo) : null;
};

export function registrarAtividade(admin: SupabaseClient, linha: LinhaDeAtividade) {
  void admin
    .from("atividade_dos_assistentes")
    .insert({
      company_id: linha.companyId,
      chave_id: linha.chaveId,
      usuario_id: linha.usuarioId,
      ferramenta: linha.ferramenta,
      tipo: linha.tipo,
      ok: linha.ok,
      resumo: curto(linha.resumo, 300),
      erro: curto(linha.erro, 300),
      cliente: curto(linha.cliente, 60),
      duracao_ms: Number.isFinite(linha.duracaoMs) ? Math.round(Number(linha.duracaoMs)) : null,
    })
    .then(({ error }) => {
      if (error) console.error("[mcp] não foi possível registrar a atividade:", error.message);
    });

  if (Math.random() < CHANCE_DE_FAXINA) {
    void admin
      .from("atividade_dos_assistentes")
      .delete()
      .eq("company_id", linha.companyId)
      .lt("criada_em", new Date(Date.now() - GUARDA_POR_MS).toISOString())
      .then(({ error }) => {
        if (error) console.error("[mcp] não foi possível limpar a atividade antiga:", error.message);
      });
  }
}
