import { Platform } from "react-native";
import apiClient, { ApiClientError } from "./apiClient";
import type { ApiEnvelope, LoginData, MobileUser, RefreshData } from "../types/auth";

function buildDevicePayload() {
  return {
    device_id: `mobile-${Platform.OS}`,
    device_name: Platform.OS,
    platform: Platform.OS,
  };
}

async function postWithEndpointFallback<T>(
  endpoints: string[],
  body: unknown,
  headers: Record<string, string>
): Promise<T> {
  // Essaie tous les endpoints sauf le dernier en ignorant les 404 (fallback).
  // Le dernier endpoint propage ses erreurs telles quelles.
  for (let index = 0; index < endpoints.length - 1; index += 1) {
    try {
      const response = await apiClient.post<T>(endpoints[index], body, { headers });
      return response.data;
    } catch (error) {
      const is404 = error instanceof ApiClientError && error.status === 404;
      if (!is404) {
        throw error;
      }
    }
  }
  const last = await apiClient.post<T>(endpoints[endpoints.length - 1], body, { headers });
  return last.data;
}

async function getWithEndpointFallback<T>(endpoints: string[]): Promise<T> {
  for (let index = 0; index < endpoints.length - 1; index += 1) {
    try {
      const response = await apiClient.get<T>(endpoints[index]);
      return response.data;
    } catch (error) {
      const is404 = error instanceof ApiClientError && error.status === 404;
      if (!is404) {
        throw error;
      }
    }
  }
  const last = await apiClient.get<T>(endpoints[endpoints.length - 1]);
  return last.data;
}

// L'API auth mobile vit sous /api/mobile/* sur le backend. Le baseUrl
// stocke pointe sur /api (racine), donc on prefixe explicitement.
export async function login(
  email: string,
  password: string,
  inviteToken?: string | null
): Promise<LoginData> {
  const payload = await postWithEndpointFallback<ApiEnvelope<LoginData>>(
    ["/mobile/login.php", "/mobile/login"],
    {
      email,
      password,
      ...(inviteToken ? { invite_token: inviteToken } : {}),
      ...buildDevicePayload(),
    },
    {
      "X-Skip-Auth": "1",
      "X-Skip-Refresh": "1",
    }
  );

  if (!payload?.success || !payload.data) {
    throw new Error(payload?.message || "Login failed");
  }

  return payload.data;
}

export async function me(): Promise<MobileUser> {
  const payload = await getWithEndpointFallback<ApiEnvelope<{ user: MobileUser }>>([
    "/mobile/me.php",
    "/mobile/me",
  ]);

  if (!payload?.success || !payload.data?.user) {
    throw new Error(payload?.message || "Invalid session");
  }

  return payload.data.user;
}

export async function refresh(refreshToken: string): Promise<RefreshData> {
  const payload = await postWithEndpointFallback<ApiEnvelope<RefreshData>>(
    ["/mobile/refresh.php", "/mobile/refresh"],
    {
      refresh_token: refreshToken,
      ...buildDevicePayload(),
    },
    {
      "X-Skip-Auth": "1",
      "X-Skip-Refresh": "1",
    }
  );

  if (!payload?.success || !payload.data) {
    throw new Error(payload?.message || "Refresh failed");
  }

  return payload.data;
}

export async function logout(refreshToken: string): Promise<void> {
  await postWithEndpointFallback<ApiEnvelope<null>>(
    ["/mobile/logout.php", "/mobile/logout"],
    {
      refresh_token: refreshToken,
    },
    {
      "X-Skip-Auth": "1",
      "X-Skip-Refresh": "1",
    }
  );
}
