// INT-CLEANUP-002: Use standardized ApiError from @/types/api instead of duplicating
import { apiClient } from '@/services/api/client';
import axios, { AxiosError } from 'axios';
import type { ApiError } from '@/schemas/apiSchemas';

export interface VerifyEmailResponse {
  message: string;
  user_id: string;
}

/**
 * Vérifie l'email avec un token de vérification
 * T0185: Appelle l'endpoint GET /api/v1/auth/verify-email?token=...
 * @param token - Token de vérification depuis l'URL
 * @returns Promise avec la réponse de vérification
 * @throws ApiError en cas d'erreur
 */
export interface ResendVerificationEmailResponse {
  message: string;
}

/**
 * Vérifie l'email avec un token de vérification
 * T0185: Appelle l'endpoint GET /api/v1/auth/verify-email?token=...
 * @param token - Token de vérification depuis l'URL
 * @returns Promise avec la réponse de vérification
 * @throws ApiError en cas d'erreur
 */
export async function verifyEmail(token: string): Promise<VerifyEmailResponse> {
  try {
    const response = await apiClient.get<VerifyEmailResponse>(
      `/auth/verify-email?token=${token}`,
    );
    return response.data;
  } catch (error) {
    // Gérer les erreurs API
    if (axios.isAxiosError(error)) {
      const axiosError = error as AxiosError<{
        error?: string;
        message?: string;
      }>;

      if (axiosError.response) {
        // Erreur de réponse du serveur
        const errorMessage =
          axiosError.response.data?.error ||
          axiosError.response.data?.message ||
          'Verification failed';

        const responseData = axiosError.response.data as
          | Record<string, unknown>
          | undefined;
        const apiError: ApiError = {
          code: axiosError.response.status,
          message: errorMessage,
          timestamp: new Date().toISOString(),
          details: Array.isArray(responseData?.details)
            ? responseData.details
            : undefined,
          context: responseData,
        };

        throw apiError;
      } else if (axiosError.request) {
        // Requête envoyée mais pas de réponse
        throw {
          code: 0,
          message: 'Network error: Unable to connect to server',
          timestamp: new Date().toISOString(),
        } as ApiError;
      }
    }

    // Erreur inconnue
    throw {
      code: 0,
      message:
        error instanceof Error ? error.message : 'An unexpected error occurred',
      timestamp: new Date().toISOString(),
    } as ApiError;
  }
}

/**
 * Renvoie l'email de vérification
 * T0187: Appelle l'endpoint POST /api/v1/auth/resend-verification
 * @param email - Email de l'utilisateur
 * @returns Promise avec la réponse de renvoi
 * @throws ApiError en cas d'erreur
 */
export async function resendVerificationEmail(
  email: string,
): Promise<ResendVerificationEmailResponse> {
  try {
    const response = await apiClient.post<ResendVerificationEmailResponse>(
      '/auth/resend-verification',
      {
        email,
      },
    );
    return response.data;
  } catch (error) {
    // Gérer les erreurs API
    if (axios.isAxiosError(error)) {
      const axiosError = error as AxiosError<{
        error?: string;
        message?: string;
      }>;

      if (axiosError.response) {
        // Erreur de réponse du serveur
        const errorMessage =
          axiosError.response.data?.error ||
          axiosError.response.data?.message ||
          'Failed to resend verification email';

        const responseData = axiosError.response.data as
          | Record<string, unknown>
          | undefined;
        const apiError: ApiError = {
          code: axiosError.response.status,
          message: errorMessage,
          timestamp: new Date().toISOString(),
          details: Array.isArray(responseData?.details)
            ? responseData.details
            : undefined,
          context: responseData,
        };

        throw apiError;
      } else if (axiosError.request) {
        // Requête envoyée mais pas de réponse
        throw {
          code: 0,
          message: 'Network error: Unable to connect to server',
          timestamp: new Date().toISOString(),
        } as ApiError;
      }
    }

    // Erreur inconnue
    throw {
      code: 0,
      message:
        error instanceof Error ? error.message : 'An unexpected error occurred',
      timestamp: new Date().toISOString(),
    } as ApiError;
  }
}
