import axios from 'axios';

export class ApiContentSourceRepository {
    constructor() {
        this.apiClient = axios.create({
            baseURL: '/api',
            headers: {
                'Content-Type': 'application/json',
            },
        });
    }

    /**
     * Récupère toutes les sources de contenu
     */
    async getAll() {
        try {
            const response = await this.apiClient.get('/content-sources');
            return response.data;
        } catch (error) {
            throw new Error(error.response?.data?.message || 'Erreur lors de la récupération des sources');
        }
    }

    /**
     * Récupère une source de contenu par son ID
     */
    async getById(id) {
        try {
            const response = await this.apiClient.get(`/content-sources/${id}`);
            return response.data;
        } catch (error) {
            throw new Error(error.response?.data?.message || 'Erreur lors de la récupération de la source');
        }
    }

    /**
     * Crée une nouvelle source de contenu
     */
    async create(contentSource) {
        try {
            const response = await this.apiClient.post('/content-sources', contentSource);
            return response.data;
        } catch (error) {
            throw new Error(error.response?.data?.message || 'Erreur lors de la création de la source');
        }
    }

    /**
     * Met à jour une source de contenu
     */
    async update(id, contentSource) {
        try {
            const response = await this.apiClient.put(`/content-sources/${id}`, contentSource);
            return response.data;
        } catch (error) {
            throw new Error(error.response?.data?.message || 'Erreur lors de la mise à jour de la source');
        }
    }

    /**
     * Exporte toutes les sources de contenu
     */
    async export() {
        try {
            const response = await this.apiClient.get('/content-sources/export');
            return response.data;
        } catch (error) {
            throw new Error(error.response?.data?.message || 'Erreur lors de l\'export des sources');
        }
    }

    /**
     * Importe des sources de contenu
     */
    async import(contentSources) {
        try {
            const response = await this.apiClient.post('/content-sources/import', contentSources);
            return response.data;
        } catch (error) {
            throw new Error(error.response?.data?.message || 'Erreur lors de l\'import des sources');
        }
    }

    /**
     * Déclenche le test de santé de tous les scrapers
     */
    async checkAllHealth() {
        try {
            await this.apiClient.post('/scraping/check-all-health', {});
        } catch (error) {
            throw new Error(error.response?.data?.message || 'Erreur lors du lancement du health check');
        }
    }

    /**
     * Supprime une source de contenu
     */
    async delete(id) {
        try {
            await this.apiClient.delete(`/content-sources/${id}`);
        } catch (error) {
            throw new Error(error.response?.data?.message || 'Erreur lors de la suppression de la source');
        }
    }

    /**
     * Teste une configuration de scraper
     */
    async testConfiguration(configuration) {
        try {
            const response = await this.apiClient.post('/scraping/test-configuration', configuration);
            return response.data;
        } catch (error) {
            // Gestion spécifique des erreurs de validation
            if (error.response?.status === 422) {
                const validationErrors = error.response.data?.violations || [];
                const errorMessage = validationErrors.map(violation =>
                    `${violation.propertyPath}: ${violation.message}`
                ).join(', ') || 'Erreur de validation';
                throw new Error(errorMessage);
            }
            throw new Error(error.response?.data?.message || 'Erreur lors du test de la configuration');
        }
    }
}
