import { requireApiV1Auth } from "@/lib/api-v1/auth";
import { apiJsonOk, toApiErrorResponse } from "@/lib/api-v1/response";
import {
  deletePaymentLink,
  getPaymentLinkById,
  resolvePaymentLinksContext,
  updatePaymentLink,
} from "@/lib/api-v1/services/payment-links-service";
import { applyApiRateLimit } from "@/lib/api-v1/rate-limit";
import { ensureUuid, parseJsonObject } from "@/lib/api-v1/validators";

export async function GET(request: Request, context: { params: Promise<{ id: string }> }) {
  try {
    const { id } = await context.params;
    const linkId = ensureUuid(id, "invalid_payment_link_id", "Link de pagamento invalido.");
    const auth = await requireApiV1Auth(request, "financial.links.read");
    const resolved = await resolvePaymentLinksContext({
      request,
      supabase: auth.supabase,
      user: auth.user,
      admin: auth.admin,
    });
    const rateLimit = applyApiRateLimit(
      request,
      {
        namespace: "api-v1:payment-links:get-by-id",
        windowMs: 60_000,
        maxPerIp: 120,
        maxPerUser: 120,
      },
      auth.user.id
    );
    const result = await getPaymentLinkById({ resolved, id: linkId });
    return apiJsonOk(result.link, { headers: rateLimit.headers });
  } catch (error) {
    return toApiErrorResponse(error);
  }
}

export async function PATCH(request: Request, context: { params: Promise<{ id: string }> }) {
  try {
    const { id } = await context.params;
    const linkId = ensureUuid(id, "invalid_payment_link_id", "Link de pagamento invalido.");
    const auth = await requireApiV1Auth(request, "financial.links.write");
    const resolved = await resolvePaymentLinksContext({
      request,
      supabase: auth.supabase,
      user: auth.user,
      admin: auth.admin,
    });
    const rateLimit = applyApiRateLimit(
      request,
      {
        namespace: "api-v1:payment-links:patch",
        windowMs: 60_000,
        maxPerIp: 60,
        maxPerUser: 60,
      },
      auth.user.id
    );
    const body = await parseJsonObject(request);
    const result = await updatePaymentLink({ resolved, id: linkId, body });
    return apiJsonOk(result.link, { headers: rateLimit.headers });
  } catch (error) {
    return toApiErrorResponse(error);
  }
}

export async function DELETE(request: Request, context: { params: Promise<{ id: string }> }) {
  try {
    const { id } = await context.params;
    const linkId = ensureUuid(id, "invalid_payment_link_id", "Link de pagamento invalido.");
    const auth = await requireApiV1Auth(request, "financial.links.write");
    const resolved = await resolvePaymentLinksContext({
      request,
      supabase: auth.supabase,
      user: auth.user,
      admin: auth.admin,
    });
    const rateLimit = applyApiRateLimit(
      request,
      {
        namespace: "api-v1:payment-links:delete",
        windowMs: 60_000,
        maxPerIp: 30,
        maxPerUser: 30,
      },
      auth.user.id
    );
    await deletePaymentLink({ resolved, id: linkId });
    return apiJsonOk({ deleted: true }, { headers: rateLimit.headers });
  } catch (error) {
    return toApiErrorResponse(error);
  }
}
