// Import shared types
import NodeVersionArray from '../types/NodeVersionArray';

/**
 * Get the current LTS Node version from the Node.js website.
 * @author Gabe Abrams
 * @returns major version of Node.js (e.g. 22) or null if not found
 */
const getCurrentEvenLTSNodeVersion = async (): Promise<number | null> => {
  // Get node versions
  let nodeVersions: NodeVersionArray = [];
  let retries = 3;
  while (retries > 0) {
    try {
      const nodeVersionsResponse = await fetch('https://nodejs.org/download/release/index.json');
      nodeVersions = await nodeVersionsResponse.json();
      break;
    } catch (error) {
      retries -= 1;
      if (retries === 0) {
        throw error;
      }
    }
  }
  if (nodeVersions.length === 0) {
    throw new Error('Unable to fetch Node.js versions from the Node.js website.');
  }

  let currentEvenMajorLTSVersion: number | null = null;
  nodeVersions.forEach((version) => {
    const versionParts = version.version.split('.');
    const majorVersion = Number.parseInt(versionParts[0].replace('v', ''), 10);
    const isEven = (majorVersion % 2 === 0);
    const isLTS = (version.lts !== false);
    if (isLTS && isEven) {
      // Check if this is the first even major LTS version
      // or if it's greater than the current one
      if (!currentEvenMajorLTSVersion || majorVersion > currentEvenMajorLTSVersion) {
        // Update the current even major LTS version
        currentEvenMajorLTSVersion = majorVersion;
      }
    }
  });
  return currentEvenMajorLTSVersion;
};

export default getCurrentEvenLTSNodeVersion;
