const path = require('path')
const fs = require('fs')
const semver = require('semver')
const { getLastMajorForMaster } = require('../get-last-major-for-master')
const { GitProcess } = require('dugite')
const { promisify } = require('util')

const readFile = promisify(fs.readFile)
const gitDir = path.resolve(__dirname, '..', '..')

const preType = {
  NONE: 'none',
  PARTIAL: 'partial',
  FULL: 'full'
}

const getCurrentDate = () => {
  const d = new Date()
  const dd = `${d.getDate()}`.padStart(2, '0')
  const mm = `${d.getMonth() + 1}`.padStart(2, '0')
  const yyyy = d.getFullYear()
  return `${yyyy}${mm}${dd}`
}

const isNightly = v => v.includes('nightly')
const isBeta = v => v.includes('beta')
const isStable = v => {
  const parsed = semver.parse(v)
  return !!(parsed && parsed.prerelease.length === 0)
}

const makeVersion = (components, delim, pre = preType.NONE) => {
  let version = [components.major, components.minor, components.patch].join(delim)
  if (pre === preType.PARTIAL) {
    version += `${delim}${components.pre[1] || 0}`
  } else if (pre === preType.FULL) {
    version += `-${components.pre[0]}${delim}${components.pre[1]}`
  }
  return version
}

async function nextBeta (v) {
  const next = semver.coerce(semver.clean(v))

  const tagBlob = await GitProcess.exec(['tag', '--list', '-l', `v${next}-beta.*`], gitDir)
  const tags = tagBlob.stdout.split('\n').filter(e => e !== '')
  tags.sort((t1, t2) => semver.gt(t1, t2))

  // increment the latest existing beta tag or start at beta.1 if it's a new beta line
  return tags.length === 0 ? `${next}-beta.1` : semver.inc(tags.pop(), 'prerelease')
}

async function getElectronVersion () {
  const versionPath = path.join(__dirname, '..', '..', 'ELECTRON_VERSION')
  const version = await readFile(versionPath, 'utf8')
  return version.trim()
}

async function nextNightly (v) {
  let next = semver.valid(semver.coerce(v))
  const pre = `nightly.${getCurrentDate()}`

  const branch = (await GitProcess.exec(['rev-parse', '--abbrev-ref', 'HEAD'], gitDir)).stdout.trim()
  if (branch === 'master') {
    next = semver.inc(await getLastMajorForMaster(), 'major')
  } else if (isStable(v)) {
    next = semver.inc(next, 'patch')
  }

  return `${next}-${pre}`
}

module.exports = {
  isStable,
  isBeta,
  isNightly,
  nextBeta,
  makeVersion,
  getElectronVersion,
  nextNightly,
  preType
}
