import { NextResponse } from "next/server";
import { createAdminClient } from "@/lib/supabase-admin";
import { buildShippingPackageFromItems, sanitizePostalCode, type ShippingItemInput } from "@/lib/catalog-shipping";
import { calculateCatalogShippingQuotes } from "@/lib/catalog-shipping-server";

export const runtime = "nodejs";
export const dynamic = "force-dynamic";

export async function POST(request: Request) {
  try {
    const body = (await request.json().catch(() => null)) as
      | {
          slug?: string;
          zip?: string;
          items?: ShippingItemInput[];
        }
      | null;

    const slug = String(body?.slug || "").trim();
    const zip = sanitizePostalCode(body?.zip);
    const items = Array.isArray(body?.items) ? body?.items : [];

    if (!slug) {
      return NextResponse.json({ error: "Loja inválida." }, { status: 400 });
    }
    if (zip.length !== 8) {
      return NextResponse.json({ error: "Informe um CEP válido." }, { status: 400 });
    }

    const packageResult = buildShippingPackageFromItems(items);
    if (!packageResult.ok || !packageResult.packageMetrics) {
      return NextResponse.json(
        {
          error: packageResult.reason,
          missing_fields: packageResult.missing_fields,
        },
        { status: 400 }
      );
    }

    const admin = createAdminClient();
    const providers = await calculateCatalogShippingQuotes(admin, {
      slug,
      destinationZip: zip,
      packageMetrics: packageResult.packageMetrics,
    });

    const hasAnyOptions = providers.some((provider) => provider.options.length > 0);
    if (!hasAnyOptions) {
      return NextResponse.json(
        {
          error: "Não encontramos opções de frete para esse CEP no momento.",
          providers,
          package: packageResult.packageMetrics,
          package_signature: packageResult.packageSignature,
        },
        { status: 400 }
      );
    }

    return NextResponse.json({
      providers,
      package: packageResult.packageMetrics,
      package_signature: packageResult.packageSignature,
    });
  } catch (error) {
    const message = error instanceof Error ? error.message : "Não foi possível calcular o frete.";
    return NextResponse.json({ error: message }, { status: 400 });
  }
}
