/**
 * Modèle représentant une source de contenu pour le scraping
 */
export class ContentSource {
    constructor({
        id = null,
        baseUrl = '',
        chapterUrlFormat = '',
        scrapingType = 'HTML',
        imageSelector = null,
        nextPageSelector = null,
        chapterSelector = null,
        cleanBaseUrl = '',
        token = null
    } = {}) {
        this.id = id;
        this.baseUrl = baseUrl;
        this.chapterUrlFormat = chapterUrlFormat;
        this.scrapingType = scrapingType;
        this.imageSelector = imageSelector;
        this.nextPageSelector = nextPageSelector;
        this.chapterSelector = chapterSelector;
        this.cleanBaseUrl = cleanBaseUrl || this.extractCleanBaseUrl(baseUrl);
        this.token = token;
    }

    /**
     * Extrait une URL propre à partir de l'URL de base
     */
    extractCleanBaseUrl(url) {
        if (!url) return '';

        try {
            const urlObj = new URL(url);
            return urlObj.hostname;
        } catch (error) {
            return url;
        }
    }

    /**
     * Vérifie si la source est valide
     */
    isValid() {
        return !!(this.baseUrl && this.chapterUrlFormat);
    }

    /**
     * Vérifie si la source est de type JavaScript
     */
    isJavascriptSource() {
        return this.scrapingType === 'Javascript';
    }

    /**
     * Vérifie si la source est de type HTML
     */
    isHtmlSource() {
        return this.scrapingType === 'HTML';
    }

    /**
     * Détermine l'orientation basée sur les sélecteurs
     */
    getOrientation() {
        return this.nextPageSelector ? 'vertical' : 'horizontal';
    }

    /**
     * Génère une URL de chapitre basée sur le format
     */
    generateChapterUrl(slug, chapterNumber) {
        return this.chapterUrlFormat
            .replace('{slug}', slug)
            .replace('{chapterNumber}', chapterNumber);
    }

    /**
     * Convertit l'objet en format API
     */
    toApiFormat() {
        return {
            baseUrl: this.baseUrl,
            chapterUrlFormat: this.chapterUrlFormat,
            scrapingType: this.scrapingType,
            imageSelector: this.imageSelector,
            nextPageSelector: this.nextPageSelector,
            chapterSelector: this.chapterSelector,
            token: this.token
        };
    }

    /**
     * Crée une instance depuis les données API
     */
    static fromApiData(data) {
        return new ContentSource(data);
    }

    /**
     * Clone l'instance
     */
    clone() {
        return new ContentSource({
            id: this.id,
            baseUrl: this.baseUrl,
            chapterUrlFormat: this.chapterUrlFormat,
            scrapingType: this.scrapingType,
            imageSelector: this.imageSelector,
            nextPageSelector: this.nextPageSelector,
            chapterSelector: this.chapterSelector,
            cleanBaseUrl: this.cleanBaseUrl,
            token: this.token
        });
    }
}
