import { API_BASE_URL } from "@/utils/constants";
import { ApiError } from "@/services/apiClient";
import type { ApiResponse, AuthTokens, RegisterPayload, User } from "@/types";

const API_TIMEOUT_MS = 8000;

export async function registerUser(
  payload: RegisterPayload,
): Promise<{ user: User; token: string }> {
  const controller = new AbortController();
  const timeoutId = setTimeout(() => controller.abort(), API_TIMEOUT_MS);

  try {
    const response = await fetch(`${API_BASE_URL}/auth/register`, {
      method: "POST",
      headers: {
        Accept: "application/json",
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        name: payload.name,
        email: payload.email,
        password: payload.password,
        password_confirmation: payload.passwordConfirmation,
      }),
      signal: controller.signal,
    });

    const body = await response.json().catch(() => null);

    if (!response.ok) {
      const err = body as {
        message?: string;
        errors?: Record<string, string[]>;
      };
      const firstField = err?.errors
        ? Object.values(err.errors).flat()[0]
        : undefined;
      throw new ApiError(
        firstField ?? err?.message ?? "Não foi possível criar a conta.",
        response.status,
        body,
      );
    }

    const data = (body as ApiResponse<{ user: User; token: AuthTokens }>).data;
    const token =
      typeof data.token === "string" ? data.token : data.token?.accessToken;

    if (!data?.user || !token) {
      throw new Error("Resposta inválida ao criar conta.");
    }

    return { user: data.user, token };
  } catch (error) {
    if (error instanceof ApiError) {
      throw new Error(error.message);
    }
    if (error instanceof DOMException && error.name === "AbortError") {
      throw new Error(
        "O servidor demorou para responder. Tente novamente em instantes.",
      );
    }
    throw new Error(
      error instanceof Error
        ? error.message
        : "Não foi possível criar sua conta.",
    );
  } finally {
    clearTimeout(timeoutId);
  }
}
