import { API_CONFIG, DEFAULT_REQUEST_CONFIG } from '@/config/api.js';
import AuthService from '@/service/AuthService.js';
import { CampaignDto } from '@/types/smm.js';

/**
 * CampaignService - Управление кампаниями
 * Базовый путь: /api/smm/campaigns
 */
class CampaignService {
    constructor() {
        this.baseUrl = API_CONFIG.SMM_BASE_URL;
        this.endpoints = {
            campaigns: API_CONFIG.ENDPOINTS.CAMPAIGNS,
            campaignById: API_CONFIG.ENDPOINTS.CAMPAIGN_BY_ID
        };
    }

    /**
     * Получить все кампании
     * GET /api/smm/campaigns
     * @returns {Promise<CampaignDto[]>}
     */
    async getAllCampaigns() {
        try {
            const response = await AuthService.authFetch(`${this.baseUrl}${this.endpoints.campaigns}`, {
                method: 'GET',
                headers: {
                    ...DEFAULT_REQUEST_CONFIG.headers
                }
            });

            if (!response.ok) {
                throw new Error(`HTTP error! status: ${response.status}`);
            }

            const data = await response.json();
            return data.map((campaign) => new CampaignDto(campaign));
        } catch (error) {
            console.error('Error fetching campaigns:', error);
            throw error;
        }
    }

    /**
     * Получить кампанию по ID
     * GET /api/smm/campaigns/{id}
     * @param {string} id - UUID кампании
     * @returns {Promise<CampaignDto>}
     */
    async getCampaignById(id) {
        try {
            const response = await AuthService.authFetch(`${this.baseUrl}${this.endpoints.campaignById}/${id}`, {
                method: 'GET',
                headers: {
                    ...DEFAULT_REQUEST_CONFIG.headers
                }
            });

            if (!response.ok) {
                throw new Error(`HTTP error! status: ${response.status}`);
            }

            const data = await response.json();
            return new CampaignDto(data);
        } catch (error) {
            console.error(`Error fetching campaign ${id}:`, error);
            throw error;
        }
    }

    /**
     * Создать кампанию
     * POST /api/smm/campaigns
     * @param {Object} campaignData - Данные кампании
     * @param {string} campaignData.name - Название кампании
     * @param {string} campaignData.goal - Цель кампании
     * @param {number} campaignData.budget - Бюджет кампании
     * @param {string} campaignData.startAt - Дата начала (ISO 8601)
     * @param {string} campaignData.endAt - Дата окончания (ISO 8601)
     * @param {string} campaignData.status - Статус кампании
     * @returns {Promise<CampaignDto>}
     */
    async createCampaign(campaignData) {
        try {
            // Валидация
            this.validateCampaignData(campaignData);

            const response = await AuthService.authFetch(`${this.baseUrl}${this.endpoints.campaigns}`, {
                method: 'POST',
                headers: {
                    ...DEFAULT_REQUEST_CONFIG.headers
                },
                body: JSON.stringify(campaignData)
            });

            if (!response.ok) {
                const errorData = await response.json();
                throw new Error(`HTTP error! status: ${response.status}, message: ${errorData.message || 'Unknown error'}`);
            }

            const data = await response.json();
            return new CampaignDto(data);
        } catch (error) {
            console.error('Error creating campaign:', error);
            throw error;
        }
    }

    /**
     * Обновить кампанию
     * PUT /api/smm/campaigns/{id}
     * @param {string} id - UUID кампании
     * @param {Object} campaignData - Данные кампании
     * @returns {Promise<CampaignDto>}
     */
    async updateCampaign(id, campaignData) {
        try {
            // Валидация
            this.validateCampaignData(campaignData);

            const response = await AuthService.authFetch(`${this.baseUrl}${this.endpoints.campaignById}/${id}`, {
                method: 'PUT',
                headers: {
                    ...DEFAULT_REQUEST_CONFIG.headers
                },
                body: JSON.stringify(campaignData)
            });

            if (!response.ok) {
                const errorData = await response.json();
                throw new Error(`HTTP error! status: ${response.status}, message: ${errorData.message || 'Unknown error'}`);
            }

            const data = await response.json();
            return new CampaignDto(data);
        } catch (error) {
            console.error(`Error updating campaign ${id}:`, error);
            throw error;
        }
    }

    /**
     * Удалить кампанию
     * DELETE /api/smm/campaigns/{id}
     * @param {string} id - UUID кампании
     * @returns {Promise<void>}
     */
    async deleteCampaign(id) {
        try {
            const response = await AuthService.authFetch(`${this.baseUrl}${this.endpoints.campaignById}/${id}`, {
                method: 'DELETE'
            });

            if (!response.ok) {
                throw new Error(`HTTP error! status: ${response.status}`);
            }
        } catch (error) {
            console.error(`Error deleting campaign ${id}:`, error);
            throw error;
        }
    }

    /**
     * Валидация данных кампании
     * @param {Object} campaignData - Данные кампании
     * @throws {Error} Если валидация не прошла
     */
    validateCampaignData(campaignData) {
        if (!campaignData.name || campaignData.name.trim() === '') {
            throw new Error('Название кампании обязательно');
        }

        if (campaignData.budget !== undefined && campaignData.budget < 0) {
            throw new Error('Бюджет должен быть >= 0');
        }

        if (campaignData.startAt) {
            const startDate = new Date(campaignData.startAt);
            if (isNaN(startDate.getTime())) {
                throw new Error('Неверный формат даты начала');
            }
        }

        if (campaignData.endAt) {
            const endDate = new Date(campaignData.endAt);
            if (isNaN(endDate.getTime())) {
                throw new Error('Неверный формат даты окончания');
            }
        }

        if (campaignData.startAt && campaignData.endAt) {
            const startDate = new Date(campaignData.startAt);
            const endDate = new Date(campaignData.endAt);
            if (endDate <= startDate) {
                throw new Error('Дата окончания должна быть позже даты начала');
            }
        }
    }
}

// Экспорт singleton instance
export default new CampaignService();
