/**
 * Configuration centralisée des endpoints de l'API et des clés TanStack Query.
 *
 * Objectif :
 * - Centraliser tous les chemins de l'API pour faciliter la maintenance.
 * - Fournir des "factories" de clés de query pour garantir la cohérence
 *   et éviter les erreurs de frappe dans l'utilisation de TanStack Query.
 *
 * Structure :
 * - `apiEndpoints`: Contient les chemins relatifs des endpoints de l'API.
 * - `queryKeys`: Contient des fonctions pour générer les clés de query.
 */

export const API_CONFIG = {
  baseURL: process.env.NEXT_PUBLIC_API_URL || "http://localhost:8000",
  timeout: 10000, // 10 secondes
  defaultHeaders: {
    "Content-Type": "application/json",
    Accept: "application/json",
  },
};

export const HTTP_STATUS = {
  OK: 200,
  CREATED: 201,
  NO_CONTENT: 204,
  BAD_REQUEST: 400,
  UNAUTHORIZED: 401,
  FORBIDDEN: 403,
  NOT_FOUND: 404,
  UNPROCESSABLE_ENTITY: 422,
  INTERNAL_SERVER_ERROR: 500,
};

export const ERROR_MESSAGES = {
  NETWORK_ERROR: "Erreur réseau. Vérifiez votre connexion internet.",
  UNAUTHORIZED: "Non autorisé. Veuillez vous reconnecter.",
  FORBIDDEN: "Accès refusé.",
  NOT_FOUND: "Ressource non trouvée.",
  VALIDATION_ERROR: "Erreur de validation des données.",
  SERVER_ERROR: "Erreur interne du serveur.",
  UNKNOWN_ERROR: "Une erreur inattendue s'est produite.",
};

export interface HttpError extends Error {
  status: number;
  data?: any;
}

export const createHttpError = (status: number, message: string, data?: any): HttpError => {
  const error = new Error(message) as HttpError;
  error.status = status;
  error.data = data;
  return error;
};

export const QUERY_CONFIG = {
  defaultOptions: {
    queries: {
      // Options par défaut pour toutes les queries
      staleTime: 1000 * 60 * 5, // 5 minutes
      refetchOnWindowFocus: false, // Désactiver le refetch au focus de la fenêtre
      retry: (failureCount: number, error: any) => {
        // Ne pas réessayer sur les erreurs 4xx (client)
        if (error.status >= 400 && error.status < 500) return false;
        return failureCount < 3; // Réessayer jusqu'à 3 fois pour les autres erreurs
      },
    },
  },
};

export const apiEndpoints = {
  // --- Authentification (Backend Simple) ---
  auth: {
    login: "/api/auth/jwt/create/", // Corresponds to backend URLs
    register: "/api/auth/users/", // Djoser default
    logout: "/api/auth/jwt/logout/", // Custom logout endpoint
    me: "/api/auth/users/me/", // Djoser default
    token: {
      refresh: "/api/auth/jwt/refresh/",
      verify: "/api/auth/jwt/verify/",
    },
    password: {
      reset: "/api/auth/users/reset_password/",
      resetConfirm: "/api/auth/users/reset_password_confirm/",
      change: "/api/auth/users/set_password/",
    },
  },

  // --- Banking ---
  banking: {
    accounts: {
      list: "/api/banking/accounts/",
      detail: (id: number) => `/api/banking/accounts/${id}/`,
      create: "/api/banking/accounts/",
      createForClient: "/api/banking/accounts/create_for_client/",
      update: (id: number) => `/api/banking/accounts/${id}/`,
      delete: (id: number) => `/api/banking/accounts/${id}/`,
      freeze: (id: number) => `/api/banking/accounts/${id}/freeze/`,
      unfreeze: (id: number) => `/api/banking/accounts/${id}/unfreeze/`,
      balance: (id: number) => `/api/banking/accounts/${id}/balance/`,
      statement: (id: number) => `/api/banking/accounts/${id}/statement/`,
      bulkActions: "/api/banking/accounts/bulk_actions/",
    },
    transactions: {
      list: "/api/banking/transactions/",
      detail: (id: number) => `/api/banking/transactions/${id}/`,
      create: "/api/banking/transactions/",
      createForClient: "/api/banking/transactions/create_for_client/",
      deposit: "/api/banking/transactions/deposit/",
      withdrawal: "/api/banking/transactions/withdrawal/",
      cancel: (id: number) => `/api/banking/transactions/${id}/cancel/`,
      reverse: (id: number) => `/api/banking/transactions/${id}/reverse/`,
      bulkActions: "/api/banking/transactions/bulk_actions/",
    },
    transfers: {
        list: "/api/banking/transfers/",
        detail: (id: number) => `/api/banking/transfers/${id}/`,
        create: "/api/banking/transfers/",
        cancel: (id: number) => `/api/banking/transfers/${id}/cancel/`,
        process: (id: number) => `/api/banking/transfers/${id}/process/`,
    },
    stats: "/api/banking/stats/",
    reports: {
        accountStatement: "/api/banking/reports/account_statement/",
        transactionSummary: "/api/banking/reports/transaction_summary/",
        transferReport: "/api/banking/reports/transfer_report/",
    }
  },
  users: {
    list: "/api/auth/users/",
    detail: (id: number) => `/api/auth/users/${id}/`,
    create: "/api/auth/users/",
    update: (id: number) => `/api/auth/users/${id}/`,
    delete: (id: number) => `/api/auth/users/${id}/`,
    stats: "/api/auth/users/stats/",
    bulkActions: "/api/auth/users/bulk_actions/",
  },
  // credits: { ... },
};

export const QUERY_KEYS = {
  all: ["amifond-app"] as const,
  auth: {
    all: () => [...QUERY_KEYS.all, "auth"] as const,
    user: () => [...QUERY_KEYS.auth.all(), "user"] as const,
  },
  banking: {
    all: () => [...QUERY_KEYS.all, "banking"] as const,
    accounts: () => [...QUERY_KEYS.banking.all(), "accounts"] as const,
    account: (id: number) => [...QUERY_KEYS.banking.accounts(), id] as const,
    transactions: () => [...QUERY_KEYS.banking.all(), "transactions"] as const,
    transaction: (id: number) => [...QUERY_KEYS.banking.transactions(), id] as const,
    transfers: () => [...QUERY_KEYS.banking.all(), "transfers"] as const,
    transfer: (id: number) => [...QUERY_KEYS.banking.transfers(), id] as const,
    stats: () => [...QUERY_KEYS.banking.all(), "stats"] as const,
  },
  users: {
    all: () => [...QUERY_KEYS.all, "users"] as const,
    lists: () => [...QUERY_KEYS.users.all(), "list"] as const,
    list: (filters: string) => [...QUERY_KEYS.users.lists(), { filters }] as const,
    details: () => [...QUERY_KEYS.users.all(), "details"] as const,
    detail: (id: number) => [...QUERY_KEYS.users.details(), id] as const,
  },
  // ... autres clés de query
};