import { ApiV1Error } from "@/lib/api-v1/errors";
import { buildSessionPayload, createExternalSupabaseClient } from "@/lib/api-v1/auth";
import { apiJsonOk, toApiErrorResponse } from "@/lib/api-v1/response";
import { applyApiRateLimit } from "@/lib/api-v1/rate-limit";
import { parseJsonObject, requireTrimmedString } from "@/lib/api-v1/validators";

export async function POST(request: Request) {
  try {
    const rateLimit = applyApiRateLimit(request, {
      namespace: "api-v1:auth:refresh",
      windowMs: 60_000,
      maxPerIp: 20,
    });
    const body = await parseJsonObject(request);
    const refreshToken = requireTrimmedString(body.refresh_token, "missing_refresh_token", "Refresh token obrigatorio.");

    const supabase = createExternalSupabaseClient();
    const authApi = supabase.auth as unknown as {
      refreshSession: (session: { refresh_token: string }) => Promise<{
        data: { session: { access_token: string; refresh_token: string } | null };
        error: { message?: string } | null;
      }>;
    };

    const { data, error } = await authApi.refreshSession({ refresh_token: refreshToken });
    if (error || !data.session?.access_token || !data.session.refresh_token) {
      throw new ApiV1Error(401, "invalid_refresh_token", error?.message || "Refresh token invalido.");
    }

    return apiJsonOk(
      {
        session: await buildSessionPayload(data.session.access_token, data.session.refresh_token),
      },
      { headers: rateLimit.headers }
    );
  } catch (error) {
    return toApiErrorResponse(error);
  }
}
