import { NextResponse } from "next/server";

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

import { ErroDaRegra, type AcessoAsRegras } from "./servico";

/**
 * Quem chama as rotas de /api/regras: a pessoa logada, com company.settings.
 * Mora fora das rotas porque um arquivo de rota do Next só exporta handlers.
 */
export async function acessoDaRota(): Promise<{ acesso: AcessoAsRegras } | { erro: NextResponse }> {
  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();
  if (!user) return { erro: NextResponse.json({ error: "Entre de novo para continuar." }, { status: 401 }) };

  const contexto = await getCompanyContext(supabase, user);
  if (!canCompany(contexto, user.id, "company.settings")) {
    return { erro: NextResponse.json({ error: "Só quem pode mudar as configurações da empresa mexe nas regras." }, { status: 403 }) };
  }
  const dono = contexto.ownerId ?? user.id;
  const tenantIds = Array.from(new Set([dono, ...(contexto.tenantIds ?? [])]));
  return {
    acesso: {
      supabase,
      admin: createAdminClient(),
      empresa: { dono, tenantIds },
      usuarioId: user.id,
      pode: (permissao) => canCompany(contexto, user.id, permissao),
    },
  };
}

/** Erro de regra vira 400 com a mensagem; o resto, 500 sem detalhe. */
export function respostaDeErro(erro: unknown) {
  if (erro instanceof ErroDaRegra) return NextResponse.json({ error: erro.message }, { status: 400 });
  console.error("[regras] rota falhou", erro instanceof Error ? erro.message : erro);
  return NextResponse.json({ error: "Não foi possível concluir agora. Tente de novo em instantes." }, { status: 500 });
}
