const fs = require('fs-extra');
const FileDetector = require('../FileDetector');

//порядок важен
const convertClassFactory = [
    require('./ConvertEpub'),
    require('./ConvertPdf'),
    require('./ConvertRtf'),
    require('./ConvertDocX'),
    require('./ConvertDoc'),
    require('./ConvertMobi'),
    require('./ConvertFb2'),
    require('./ConvertSamlib'),
    require('./ConvertHtml'),
];

class BookConverter {
    constructor(config) {
        this.detector = new FileDetector();

        this.convertFactory = [];
        for (const convertClass of convertClassFactory) {
            this.convertFactory.push(new convertClass(config));
        }
    }

    async convertToFb2(inputFiles, outputFile, url, callback) {
        const selectedFileType = await this.detector.detectFile(inputFiles.selectedFile);
        const data = await fs.readFile(inputFiles.selectedFile);

        let result = false;
        for (const convert of this.convertFactory) {
            result = await convert.run(data, {inputFiles, url, callback, dataType: selectedFileType});
            if (result) {
                await fs.writeFile(outputFile, result);
                break;
            }
        }

        if (!result && inputFiles.nesting) {
            result = await this.convertToFb2(inputFiles.nesting, outputFile, url, callback);
        }

        if (!result) {
            if (selectedFileType)
                throw new Error(`Этот формат файла не поддерживается: ${selectedFileType.mime}`);
            else {
                throw new Error(`Не удалось определить формат файла: ${url}`);
            }
        }

        callback(100);
        return result;
    }
}

module.exports = BookConverter;