"use client";

import { useQuery } from "@tanstack/react-query";
import { useTranslationStore } from "@/lib/store";
import { API_BASE } from "@/lib/config";
import type { AdminUsersResponse } from "./types";

export const ADMIN_TIMEOUT_MS = 15000;
export const QUERY_KEY = ["admin", "users"];

async function fetchUsers(adminToken: string | null | undefined): Promise<AdminUsersResponse> {
  if (!adminToken) {
    throw new Error("AUTH_REQUIRED");
  }

  const controller = new AbortController();
  const timeoutId = setTimeout(() => controller.abort(), ADMIN_TIMEOUT_MS);

  try {
    const response = await fetch(`${API_BASE}/api/v1/admin/users`, {
      headers: {
        Authorization: `Bearer ${adminToken}`,
      },
      signal: controller.signal,
    });

    clearTimeout(timeoutId);

    if (!response.ok) {
      if (response.status === 401) {
        throw new Error("UNAUTHORIZED");
      }
      throw new Error(`HTTP_ERROR_${response.status}`);
    }

    return await response.json();
  } catch (err) {
    clearTimeout(timeoutId);
    throw err;
  }
}

export function useAdminUsers() {
  const { settings } = useTranslationStore();

  const { data, isLoading, error, refetch } = useQuery({
    queryKey: QUERY_KEY,
    queryFn: () => fetchUsers(settings.adminToken),
    enabled: !!settings.adminToken,
    staleTime: 30000,
    retry: 1,
  });

  const getErrorMessage = (err: Error | null): string | null => {
    if (!err) return null;

    const errorMap: Record<string, string> = {
      AUTH_REQUIRED: "Veuillez vous connecter pour accéder aux utilisateurs",
      UNAUTHORIZED: "Session expirée. Veuillez vous reconnecter.",
      HTTP_ERROR_403: "Accès refusé. Droits administrateur requis.",
      HTTP_ERROR_404: "Service indisponible. Veuillez réessayer plus tard.",
      HTTP_ERROR_500: "Erreur serveur. Veuillez réessayer plus tard.",
    };

    const code = err.message;
    if (errorMap[code]) {
      return errorMap[code];
    }

    if (err.name === "AbortError") {
      return "Le serveur met trop de temps à répondre. Veuillez réessayer.";
    }

    if (err.message.includes("fetch") || err.message.includes("network")) {
      return "Impossible de se connecter au serveur. Vérifiez votre connexion.";
    }

    return "Une erreur inattendue s'est produite. Veuillez réessayer.";
  };

  const errorMessage = error ? getErrorMessage(error as Error) : null;

  return {
    data: data ?? null,
    users: data?.users ?? [],
    total: data?.total ?? 0,
    isLoading,
    error: errorMessage,
    refetch,
    queryKey: QUERY_KEY,
  };
}
