import { NextResponse } from "next/server";
import { createAdminClient, createClient } from "@/lib/supabase-server";
import { canCompany, getCompanyContext } from "@/lib/company-context";
import { montarDreAnalitico } from "@/lib/financeiro/dre-analitico";

function parseMonthRange(value: string) {
  if (!/^\d{4}-\d{2}$/.test(value)) return null;
  const [yearRaw, monthRaw] = value.split("-");
  const year = Number(yearRaw);
  const month = Number(monthRaw);
  if (!Number.isInteger(year) || !Number.isInteger(month)) return null;
  if (month < 1 || month > 12) return null;
  const start = new Date(Date.UTC(year, month - 1, 1, 0, 0, 0));
  const end = new Date(Date.UTC(year, month, 1, 0, 0, 0));
  return {
    start: start.toISOString().slice(0, 10),
    end: end.toISOString().slice(0, 10),
  };
}

export async function GET(req: Request) {
  const supabase = await createClient();
  const {
    data: { user },
    error: userError,
  } = await supabase.auth.getUser();

  if (userError || !user) {
    return NextResponse.json({ error: "Não autenticado." }, { status: 401 });
  }

  const ctx = await getCompanyContext(supabase, user);
  if (!canCompany(ctx, user.id, "financial.dre.read")) {
    return NextResponse.json({ error: "Sem permissão." }, { status: 403 });
  }

  /* Le com o cliente de servico, como contas a pagar e fornecedores ja leem.
     A politica desta tabela pergunta pela chave do modulo, e quem recebeu so a
     chave desta tela via a lista chegar vazia. Quem separa as empresas aqui e
     o `.eq("company_id", ...)` abaixo, nao o RLS. */
  const leitura = createAdminClient();

  const url = new URL(req.url);
  const month = url.searchParams.get("month")?.trim() ?? "";
  const bankAccountId = url.searchParams.get("bank_account_id")?.trim() ?? "";
  const origin = url.searchParams.get("origin")?.trim().toUpperCase() ?? "";
  const type = url.searchParams.get("type")?.trim().toUpperCase() ?? "";

  if (!month) {
    return NextResponse.json({ error: "Mês é obrigatório." }, { status: 400 });
  }

  const monthRange = parseMonthRange(month);
  if (!monthRange) {
    return NextResponse.json({ error: "Mês inválido." }, { status: 400 });
  }

  try {
    const resultado = await montarDreAnalitico({
      supabase,
      leitura,
      companyId: ctx.companyId,
      tenantIds: ctx.tenantIds?.length ? ctx.tenantIds : [user.id],
      intervalo: monthRange,
      bankAccountId,
      origin,
      type,
    });
    if (!resultado.ok) return NextResponse.json(resultado.corpo, { status: resultado.status });
    return NextResponse.json(resultado.corpo);
  } catch (error: unknown) {
    const err = error as { message?: string; details?: string; hint?: string; code?: string };
    console.error("Erro inesperado DRE analítico:", err);
    return NextResponse.json(
      {
        error: "Falha ao carregar DRE analítico.",
        message: err?.message ?? null,
        details: err?.details ?? null,
        hint: err?.hint ?? null,
        code: err?.code ?? null,
      },
      { status: 500 }
    );
  }
}
