import { apiClient } from '@/services/api/client';
import { AxiosError } from 'axios';

/**
 * Track Statistics Service
 * T0317: Service frontend pour récupérer les statistiques d'un track
 */

/**
 * Classe d'erreur personnalisée pour les statistiques de tracks
 */
export class TrackStatsError extends Error {
  constructor(
    message: string,
    public code: 'VALIDATION' | 'NETWORK' | 'SERVER' | 'NOT_FOUND' | 'UNKNOWN',
    public retryable: boolean = false,
    public originalError?: unknown,
  ) {
    super(message);
    this.name = 'TrackStatsError';
  }
}

/**
 * Interface pour les statistiques d'un track
 */
export interface TrackStats {
  views: number;
  likes: number;
  comments: number;
  total_play_time: number; // seconds
  downloads: number;
}

/**
 * Récupère les statistiques d'un track
 * @param trackId ID du track
 * @returns Les statistiques du track
 * @throws TrackStatsError si la requête échoue
 */
export async function getTrackStats(trackId: number): Promise<TrackStats> {
  try {
    const response = await apiClient.get<{ stats: TrackStats }>(
      `/tracks/${trackId}/stats`,
    );
    return response.data.stats;
  } catch (error) {
    if (error instanceof AxiosError) {
      if (error.response?.status === 400) {
        throw new TrackStatsError(
          'Requête invalide: ID de track invalide',
          'VALIDATION',
          false,
          error,
        );
      }
      if (error.response?.status === 404) {
        throw new TrackStatsError(
          'Track introuvable',
          'NOT_FOUND',
          false,
          error,
        );
      }
      if (error.response?.status === 500) {
        throw new TrackStatsError(
          'Erreur serveur: Impossible de récupérer les statistiques. Veuillez réessayer plus tard.',
          'SERVER',
          true,
          error,
        );
      }
      if (
        error.code === 'ECONNABORTED' ||
        error.code === 'ETIMEDOUT' ||
        !error.response
      ) {
        throw new TrackStatsError(
          'Erreur réseau: Impossible de se connecter au serveur. Veuillez vérifier votre connexion.',
          'NETWORK',
          true,
          error,
        );
      }
      const errorMessage =
        error.response?.data?.error ||
        error.message ||
        'Échec de la récupération des statistiques';
      throw new TrackStatsError(errorMessage, 'UNKNOWN', false, error);
    }
    if (error instanceof TrackStatsError) {
      throw error;
    }
    throw new TrackStatsError(
      'Erreur inconnue lors de la récupération des statistiques',
      'UNKNOWN',
      false,
      error,
    );
  }
}
