import { ApiV1Error } from "@/lib/api-v1/errors";
import { createExternalSupabaseClient, extractBearerToken } 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:logout",
      windowMs: 60_000,
      maxPerIp: 30,
    });
    const accessToken = extractBearerToken(request);
    const body = await parseJsonObject(request);
    const refreshToken = requireTrimmedString(
      body.refresh_token,
      "missing_refresh_token",
      "Refresh token obrigatorio para logout."
    );

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

    await authApi.setSession({ access_token: accessToken, refresh_token: refreshToken });
    const { error } = await authApi.signOut();
    if (error) {
      throw new ApiV1Error(400, "logout_failed", error.message || "Nao foi possivel encerrar a sessao.");
    }

    return apiJsonOk({ logged_out: true }, { headers: rateLimit.headers });
  } catch (error) {
    return toApiErrorResponse(error);
  }
}
