import { NextResponse } from "next/server";

import { ErroDoPainel } from "@/lib/fiscal-owner";
import { isOwnerUser } from "@/lib/owner-auth";
import { createAdminClient } from "@/lib/supabase-admin";
import { createClient } from "@/lib/supabase-server";

/**
 * O miolo das rotas fiscais do owner: confere a sessão do dono, abre o cliente
 * de serviço e transforma erro em resposta. Fica fora dos `route.ts` porque
 * arquivo de rota do Next só pode exportar os métodos e as opções conhecidas.
 */

type Dono = { admin: ReturnType<typeof createAdminClient>; email: string | null };

export async function rotaDoDono(trabalho: (dono: Dono) => Promise<Response>) {
  try {
    const supabase = await createClient();
    const {
      data: { user },
    } = await supabase.auth.getUser();
    if (!user || !isOwnerUser({ id: user.id, email: user.email })) {
      return NextResponse.json({ error: "Acesso negado." }, { status: 403 });
    }
    return await trabalho({ admin: createAdminClient(), email: user.email ?? null });
  } catch (erro) {
    if (erro instanceof ErroDoPainel) return NextResponse.json({ error: erro.message }, { status: erro.status });
    console.error("[owner/fiscal]", erro instanceof Error ? erro.message : erro);
    return NextResponse.json({ error: "Não foi possível concluir agora. Tente de novo em instantes." }, { status: 500 });
  }
}

export async function corpoDaRequisicao(req: Request): Promise<Record<string, unknown>> {
  try {
    const corpo = await req.json();
    return corpo && typeof corpo === "object" && !Array.isArray(corpo) ? (corpo as Record<string, unknown>) : {};
  } catch {
    throw new ErroDoPainel("Dados inválidos.");
  }
}
