#!/usr/bin/env node

const fs = require('fs')
const path = require('path')

const nodeVersionData = require('node-version-data')
const semver = require('semver')

const majorsLatest = {}
const majorsInitial = {}

nodeVersionData((err, versions) => {
  if (err) {
    console.error('Download error')
    console.error(err.stack)
    process.exit(1)
  }

  for (const v of versions) {
    const major = semver.major(v.version)  // ex: v12, v10, ...

    if (v.lts === false) continue      // ignore all but LTS

    // find the earliest LTS release for each major
    if (!majorsInitial[major]) majorsInitial[major] = v
    if (semver.lt(v.version, majorsInitial[major].version)) {
      majorsInitial[major] = v
    }

    // find the largest LTS for each major
    if (!majorsLatest[major]) majorsLatest[major] = v
    if (semver.gt(v.version, majorsLatest[major].version)) {
      majorsLatest[major] = v
    }
  }

  printLatest()
  // printInitial()
})

function printLatest() {
  console.log(`\nLatest LTS`);
  for (const m in majorsLatest) {
    const v = majorsLatest[m]
    if (isOlderThanThirtyMonths(majorsInitial[m].date)) continue
    console.log(`${v.date} ${v.version} ${v.lts}`)
  }
}

function printInitial () {
  console.log(`\nInitial LTS`);
  for (const m in majorsInitial) {
    const v = majorsInitial[m]
    if (isOlderThanThirtyMonths(majorsInitial[m].date)) continue
    console.log(`${v.date} ${v.version}`);
  }
}

function isOlderThanThirtyMonths (ymd) {
  // https://nodejs.org/en/about/releases/ says, "..for a total of 30 months"
  const now = new Date()
  const expire = deltaDate(new Date(ymd), 0, 30, 0);
  if (expire.getTime() < now.getTime()) return true
  return false;
}

function deltaDate(input, days, months, years) {
  // https://stackoverflow.com/questions/37002681/subtract-days-months-years-from-a-date-in-javascript
  return new Date(
    input.getFullYear() + years,
    input.getMonth() + months,
    Math.min(
      input.getDate() + days,
      new Date(input.getFullYear() + years, input.getMonth() + months + 1, 0).getDate()
    )
  );
}