const fs = require('fs');
const semver = require('semver');

const getFile = (path) => {
    const rawFile = fs.readFileSync(path, 'utf8');
    const file = JSON.parse(rawFile);

    return file;
};

const setMigration = () => {
    const corePackagePath = 'lib/core/package.json';
    const jaApiConfigPackagePath = 'lib/js-api/package.json';
    const coreMigrationConfigPath = 'lib/core/schematics/migrations/collection.json';

    const corePackage = getFile(corePackagePath);
    const coreMigration = getFile(coreMigrationConfigPath);
    const jsApiPackage = getFile(jaApiConfigPackagePath);

    const coreVersion = corePackage.version;

    const coreMigrations = [
        {
            name: 'move-out-alfresco-api',
            allowedVersionScope: '<=7.0.0'
        }
    ];

    console.log(`Core version is ${coreVersion}`);

    coreMigrations.forEach((migration) => {
        const isCoreVersionValid = semver.satisfies(semver.coerce(coreVersion), migration.allowedVersionScope);

        console.log(`Allowed scope for '${migration.name}' is ${migration.allowedVersionScope}`);
        console.log(`${coreVersion} is ${isCoreVersionValid ? 'VALID' : 'NOT VALID'} for ${migration.name}`);

        if (!isCoreVersionValid) {
            console.log(`Skipping migration for ${migration.name}`);
            return;
        }

        coreMigration['schematics'][migration.name]['version'] = coreVersion;

        const packageJsonUpdates = coreMigration['packageJsonUpdates'];

        if (packageJsonUpdates) {
            packageJsonUpdates[migration.name]['version'] = coreVersion;
            const packagesToUpdate = packageJsonUpdates[migration.name]['packages'];

            Object.keys(packagesToUpdate).forEach((packageName) => {
                if (packageName === 'ts-morph') {
                    return;
                }

                if (packageName === '@alfresco/js-api') {
                    packagesToUpdate[packageName]['version'] = jsApiPackage.version;
                } else {
                    packagesToUpdate[packageName]['version'] = coreVersion;
                }
            });
        }
    });

    console.log('\nmigrations:', JSON.stringify(coreMigration, null, 2));

    fs.writeFileSync(coreMigrationConfigPath, JSON.stringify(coreMigration, null, 2));
};

module.exports = setMigration;