import { requireApiV1Auth } from "@/lib/api-v1/auth";
import { apiJsonOk, toApiErrorResponse } from "@/lib/api-v1/response";
import { createQuote, listQuotes } from "@/lib/api-v1/services/quotes-service";
import { applyApiRateLimit } from "@/lib/api-v1/rate-limit";
import { ensureArray, optionalTrimmedString, parseJsonObject } from "@/lib/api-v1/validators";

export async function GET(request: Request) {
  try {
    const auth = await requireApiV1Auth(request, "quotes.read");
    const { searchParams } = new URL(request.url);
    optionalTrimmedString(searchParams.get("q"));
    const rateLimit = applyApiRateLimit(
      request,
      {
        namespace: "api-v1:quotes:get",
        windowMs: 60_000,
        maxPerIp: 120,
        maxPerUser: 120,
      },
      auth.user.id
    );
    const result = await listQuotes({ supabase: auth.supabase, user: auth.user, request });
    return apiJsonOk({ items: result.data }, {
      headers: rateLimit.headers,
    });
  } catch (error) {
    return toApiErrorResponse(error);
  }
}

export async function POST(request: Request) {
  try {
    const auth = await requireApiV1Auth(request, "quotes.write");
    const rateLimit = applyApiRateLimit(
      request,
      {
        namespace: "api-v1:quotes:post",
        windowMs: 60_000,
        maxPerIp: 60,
        maxPerUser: 60,
      },
      auth.user.id
    );
    const body = await parseJsonObject(request);
    if (body.items !== undefined) {
      ensureArray(body.items, "invalid_items", "O campo 'items' deve ser uma lista.");
    }
    /* O share_url sai daqui pronto para quem chamou: vale o prazo da empresa
       a partir de agora, e o envio fica nas métricas do link. */
    const result = await createQuote({
      supabase: auth.supabase,
      user: auth.user,
      request,
      body,
      entregaDoLink: { admin: auth.admin },
    });
    return apiJsonOk(
      {
        quote_id: result.quoteId,
        quote_number: result.quoteNumber,
        total: result.total,
        expires_at: result.expiresAt,
        share_url: result.shareUrl,
      },
      {
      headers: rateLimit.headers,
      }
    );
  } catch (error) {
    return toApiErrorResponse(error);
  }
}
