import { NextResponse } from "next/server";
import { createAdminClient, createClient } from "@/lib/supabase-server";
import { canCompany, getCompanyContext } from "@/lib/company-context";
import { rendimentoDeduzido, unidadeDiscreta } from "@/lib/orders/ficha-de-producao";

/**
 * Rendimento por folha a confirmar (migração assistida, decisão do Natan em
 * 02/09/2026).
 *
 * Antes do campo "peças por folha", as empresas gravaram o rendimento como
 * fração: papel foto a 0,17 por peça para dizer "6 por folha". A ficha de
 * produção já deduz o N e avisa; aqui a pessoa confirma com um clique, e a
 * linha passa a ter `pieces_per_unit` gravado (consumo = 1/N exato).
 *
 *   GET  — as linhas da empresa com fração escondida e o N sugerido.
 *   POST — confirma uma linha: { id, rendimento }. O N pode vir ajustado
 *          pela pessoa (o sistema sugeriu 6, ela sabe que são 8).
 */

type Linha = {
  id: string;
  product_id: string;
  consumption_qty: number | string | null;
  consumption_base: string | null;
  pieces_per_unit: number | string | null;
  products?: { name?: string | null } | null;
  materials?: { name?: string | null; unit?: string | null; purchase_format?: string | null; is_service?: boolean | null } | null;
};

async function getAuth() {
  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();
  return { supabase, user };
}

export async function GET() {
  const { supabase, user } = await getAuth();
  if (!user) return NextResponse.json({ error: "Não autenticado." }, { status: 401 });
  const ctx = await getCompanyContext(supabase, user);
  if (!canCompany(ctx, user.id, "pricing.read") && !canCompany(ctx, user.id, "production.read")) {
    return NextResponse.json({ error: "Sem permissão." }, { status: 403 });
  }

  /* Os mesmos donos que a ficha de produção enxerga: a empresa e quem
     cadastrou por ela. */
  const tenantIds = ctx.tenantIds?.length ? ctx.tenantIds : [user.id];
  const admin = createAdminClient();
  const { data, error } = await admin
    .from("product_materials")
    .select("id, product_id, consumption_qty, consumption_base, pieces_per_unit, products:products!product_id(name), materials:materials!material_id(name, unit, purchase_format, is_service)")
    .in("user_id", tenantIds)
    .is("pieces_per_unit", null)
    .lt("consumption_qty", 1)
    .gt("consumption_qty", 0);
  if (error) return NextResponse.json({ error: error.message }, { status: 400 });

  const linhas = ((data || []) as unknown as Linha[])
    .filter((l) => (l.consumption_base || "por_peca") === "por_peca" && !l.materials?.is_service)
    /* Mesma regra de `naturezaDoInsumo`: unidade inteira, ou comprado em
       resma/caixa. Chapa em m² é contínuo — "333 por chapa" seria mentira. */
    .filter((l) => {
      const formato = (l.materials?.purchase_format || "").toLowerCase();
      return unidadeDiscreta(l.materials?.unit) || formato === "resma" || formato === "caixa";
    })
    .map((l) => ({
      id: l.id,
      product_id: l.product_id,
      produto: l.products?.name || "Produto",
      insumo: l.materials?.name || "Insumo",
      unidade: l.materials?.unit || "un",
      consumo: Number(l.consumption_qty) || 0,
      sugerido: rendimentoDeduzido(Number(l.consumption_qty) || 0),
    }))
    .sort((a, b) => a.produto.localeCompare(b.produto, "pt-BR") || a.insumo.localeCompare(b.insumo, "pt-BR"));

  return NextResponse.json({ linhas });
}

export async function POST(req: Request) {
  const { supabase, user } = await getAuth();
  if (!user) return NextResponse.json({ error: "Não autenticado." }, { status: 401 });
  const ctx = await getCompanyContext(supabase, user);
  if (!canCompany(ctx, user.id, "production.board.write")) {
    return NextResponse.json({ error: "Sem permissão." }, { status: 403 });
  }

  const body = (await req.json().catch(() => null)) as { id?: unknown; rendimento?: unknown } | null;
  const id = typeof body?.id === "string" ? body.id : "";
  const rendimento = Number(body?.rendimento);
  if (!id) return NextResponse.json({ error: "Informe a linha." }, { status: 400 });
  if (!Number.isFinite(rendimento) || rendimento < 1) {
    return NextResponse.json({ error: "Informe quantas peças saem de uma folha (1 ou mais)." }, { status: 400 });
  }

  const admin = createAdminClient();
  const { data, error } = await admin
    .from("product_materials")
    .update({
      pieces_per_unit: rendimento,
      consumption_qty: Math.round((1 / rendimento) * 10000) / 10000,
    })
    .eq("id", id)
    .in("user_id", ctx.tenantIds?.length ? ctx.tenantIds : [user.id])
    .select("id, pieces_per_unit, consumption_qty")
    .single();
  if (error) return NextResponse.json({ error: error.message }, { status: 400 });
  return NextResponse.json({ ok: true, linha: data });
}
