/**
 * Classe base para o UC de editors de PDF.<br/>
 * Para criar uma nova instância utilize o Factory Method: novoEditor
 * @abstract
 */
class GOVBREditorPDFUC {
    /**
     * @type {import('./GOVBREditorPDFUserControl.mjs').GOVBREditorPDFUserControl}
     */
    userControl;
    /**
     * @type {HTMLElement}
     */
    host;

    /**
     * @param {import('./GOVBREditorPDFUserControl.mjs').GOVBREditorPDFUserControl} userControl
     * @param {HTMLElement} host
     */
    constructor(userControl, host) {
        this.userControl = userControl;
        this.host = host;

        // Trata a URL do PDF.
        let urlPDF = this.userControl.URL_PDF || '';
        if (urlPDF.startsWith('./')) {
            urlPDF = '../../.' + urlPDF;
        }

        this.host.style.width = this.userControl.LARGURA_COMPONENTE;
        this.host.style.height = this.userControl.ALTURA_COMPONENTE;
    }

    /**
     * @abstract
     */
    async init() {}

    /**
     * Inicia um novo userControl do editor para o tipo específicado.
     * @param {import('./GOVBREditorPDFUserControl.mjs').GOVBREditorPDFUserControl} userControl
     * @param {HTMLElement} host
     * @return {Promise<GOVBREditorPDFUC>}
     */
    static async novoEditor(userControl, host) {
        let instancia;
        switch (userControl.EDITOR_PDF) {
            case 'Nutrient':
                const Nutrient = await import('./GOVBREditorPDFNutrient.mjs');
                instancia = new Nutrient.GOVBREditorPDFNutrient(userControl, host);
                break;
            default:
                throw new Error('Editor de PDF não suportado: ' + userControl.EDITOR_PDF);
        }
        await instancia.init();
        return instancia;
    }
}

// Caso esteja no browser, disponibiliza o widget no objeto de window.
if (typeof window !== 'undefined') {
    // @ts-ignore
    window['GOVBREditorPDFUC'] = GOVBREditorPDFUC;
}
export { GOVBREditorPDFUC };
