import { NextResponse } from "next/server";

import { canCompany, getCompanyContext, type CompanyPermission } from "@/lib/company-context";
import { createAdminClient, createClient } from "@/lib/supabase-server";

import { criarFonte } from "./metricas";
import { hojeNoBrasil } from "./periodos";
import { ErroDoPainel } from "./servidor";

/**
 * Quem chama as rotas /api/paineis e o que pode.
 *
 * Ver um painel pede "reports.read"; criar, alterar e excluir pedem
 * "company.settings" (a tabela tem as mesmas travas no banco). Os números
 * são lidos com a chave de serviço presa às contas da empresa (`tenantIds`),
 * exatamente como o relatório (app/api/reports): quem pode ver relatórios vê
 * os totais de vendas mesmo sem abrir a tela de pedidos. As métricas do
 * financeiro ainda conferem a permissão do financeiro, uma por uma.
 */
export async function contextoDaRota() {
  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();
  if (!user) throw new ErroDoPainel(401, "Não autenticado.");

  const ctx = await getCompanyContext(supabase, user);
  const pode = (permissao: string) => canCompany(ctx, user.id, permissao as CompanyPermission);
  if (!pode("reports.read")) throw new ErroDoPainel(403, "Sem permissão para ver os painéis.");

  const empresaId = ctx.ownerId ?? ctx.companyId;
  const tenantIds = ctx.tenantIds?.length ? ctx.tenantIds : [user.id];

  return {
    supabase,
    user,
    ctx,
    empresaId,
    podeEditar: pode("company.settings"),
    fonte: () =>
      criarFonte({
        db: createAdminClient(),
        tenantIds,
        companyId: ctx.companyId,
        donoId: empresaId,
        hoje: hojeNoBrasil(),
        pode,
      }),
  };
}

export function exigirEdicao(podeEditar: boolean) {
  if (!podeEditar) throw new ErroDoPainel(403, "Só quem pode mexer nas configurações da empresa cria e altera painéis.");
}

export function respostaDeErro(erro: unknown) {
  if (erro instanceof ErroDoPainel) return NextResponse.json({ error: erro.message }, { status: erro.status });
  console.error("[paineis] rota:", erro instanceof Error ? erro.message : erro);
  return NextResponse.json({ error: "Não foi possível concluir agora. Tente de novo em instantes." }, { status: 500 });
}
