const fs = require('fs-extra');
const path = require('path');
const Service = require('@vue/cli-service/lib/Service');
const service = new Service(process.env.VUE_CLI_CONTEXT || process.cwd());
const _file = require("@babel/cli/lib/babel/file");

function buildComponent(folder, file, name) {
    service.run('build', {
            _: ['build', 'src/components/' + folder + '/' + file, 'build'],
            modern: false,
            report: false,
            'report-json': false,
            'inline-vue': false,
            watch: false,
            open: false,
            copy: true,
            https: false,
            verbose: false,
            target: 'lib',
            clean: false,
            name: name,
            dest: 'dist/' + folder
        },
        [
            'build',
            'src/components/' + folder + '/' + file,
            'build',
            '--target',
            'lib',
            '--no-clean',
            '--name',
            name,
            '--dest',
            'dist/' + folder
        ]);
}

function transpileJS(folder, file) {
    var options = {
        babelOptions: {
            configFile: './.babelrc-lib'
        },
        cliOptions: {
            filename: undefined,
            filenames: ['src/components/' + folder + '/' + file],
            extensions: undefined,
            keepFileExtension: undefined,
            outFileExtension: undefined,
            watch: undefined,
            skipInitialBuild: undefined,
            outFile: 'dist/' + folder + '/' + file,
            outDir: undefined,
            relative: undefined,
            copyFiles: undefined,
            copyIgnored: undefined,
            includeDotfiles: undefined,
            verbose: undefined,
            quiet: undefined,
            deleteDirOnStart: undefined,
            sourceMapTarget: undefined
        }
    }

    _file.default(options).catch(err => {
        console.error(err);
        process.exitCode = 1;
    });
}

function blue(str) {
    return '\x1b[1m\x1b[34m' + str + '\x1b[39m\x1b[22m';
}

function green(str) {
    return '\x1b[1m\x1b[32m' + str + '\x1b[39m\x1b[22m';
}

fs.readdirSync(path.resolve(__dirname, './src/components/')).forEach(folder => {
    fs.readdirSync(path.resolve(__dirname, './src/components/' + folder)).forEach(file => {
        if (!(/\.js$/.test(file)) || file === 'index.js') {
            fs.copySync(path.resolve(__dirname, './src/components/' + folder) + '/' + file, 'dist/' + folder + '/' + file);
        }
    });
});

fs.readdirSync(path.resolve(__dirname, './src/components/')).forEach(folder => {
    fs.readdirSync(path.resolve(__dirname, './src/components/' + folder)).forEach(file => {
        if (file !== 'index.js' && file !== 'index.d.ts') {
            let name = file.split(/(.vue)$|(.js)$/)[0].toLowerCase();
            if (/\.js$/.test(file)) {
                console.log('Transpiling ' + blue(file));
                buildComponent(folder, file, name);
                transpileJS(folder, file);
            }
            else if (/\.vue$/.test(file)) {
                console.log('Building ' + green(name));
                buildComponent(folder, file, name);
            }
        }
    });
});

fs.copySync(path.resolve(__dirname, './package-build.json'), 'dist/package.json');
fs.copySync(path.resolve(__dirname, './README.md'), 'dist/README.md');
fs.copySync(path.resolve(__dirname, './LICENSE.md'), 'dist/LICENSE.md');