'use strict';

const CiVersionCheck = require('./CiVersionCheck');
const mongoVersionList = require('mongodb-version-list');
const allNodeVersions = require('all-node-versions');

async function check() {
  // Run checks
  await checkMongoDbVersions();
  await checkNodeVersions();
}

/**
 * Check the MongoDB versions used in test environments.
 */
async function checkMongoDbVersions() {
  const releasedVersions = await new Promise((resolve, reject) => {
    mongoVersionList(function (error, versions) {
      if (error) {
        reject(error);
      }
      resolve(versions);
    });
  });

  await new CiVersionCheck({
    packageName: 'MongoDB',
    packageSupportUrl: 'https://www.mongodb.com/support-policy',
    yamlFilePath: './.github/workflows/ci.yml',
    ciEnvironmentsKeyPath: 'jobs.check-mongo.strategy.matrix.include',
    ciVersionKey: 'MONGODB_VERSION',
    releasedVersions,
    latestComponent: CiVersionCheck.versionComponents.path,
    ignoreReleasedVersions: [
      '<4.0.0', // Versions reached their MongoDB end-of-life support date
      '~4.1.0', // Development release according to MongoDB support
      '~4.3.0', // Development release according to MongoDB support
      '~4.7.0', // Development release according to MongoDB support

      '4.0.26', // Temporarily disabled because not yet available for download via mongodb-runner
    ],
  }).check();
}

/**
 * Check the Nodejs versions used in test environments.
 */
async function checkNodeVersions() {
  const allVersions = await allNodeVersions();
  const releasedVersions = allVersions.versions;

  await new CiVersionCheck({
    packageName: 'Node.js',
    packageSupportUrl: 'https://github.com/nodejs/node/blob/master/CHANGELOG.md',
    yamlFilePath: './.github/workflows/ci.yml',
    ciEnvironmentsKeyPath: 'jobs.check-mongo.strategy.matrix.include',
    ciVersionKey: 'NODE_VERSION',
    releasedVersions,
    latestComponent: CiVersionCheck.versionComponents.minor,
    ignoreReleasedVersions: [
      '<12.0.0', // These versions have reached their end-of-life support date
      '>=13.0.0 <14.0.0', // These versions have reached their end-of-life support date
      '>=15.0.0 <16.0.0', // These versions have reached their end-of-life support date
      '>=19.0.0', // These versions are not officially supported yet
    ],
  }).check();
}

check();
