import packagejson from '../package.json'
import axios from 'axios'

function parseSemver(ver) {
  if (!ver) return null
  var groups = ver.match(/^v((([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)$/)
  if (groups && groups.length > 6) {
    var total = Number(groups[3]) * 10000 + Number(groups[4]) * 100 + Number(groups[5])
    if (isNaN(total)) {
      console.warn('Invalid version total', groups[3], groups[4], groups[5])
      return null
    }
    return {
      name: ver,
      total,
      version: groups[2],
      major: Number(groups[3]),
      minor: Number(groups[4]),
      patch: Number(groups[5]),
      preRelease: groups[6] || null
    }
  } else {
    console.warn('Invalid semver string', ver)
  }
  return null
}

function getReleases() {
  return axios
    .get(`https://api.github.com/repos/advplyr/audiobookshelf/releases`)
    .then((res) => {
      return res.data
        .map((release) => {
          const tagName = release.tag_name
          const verObj = parseSemver(tagName)
          if (verObj) {
            verObj.pubdate = new Date(release.published_at)
            verObj.changelog = release.body
            return verObj
          }
          return null
        })
        .filter((verObj) => verObj)
    })
    .catch((error) => {
      console.error('Failed to get releases', error)
      return []
    })
}

export const currentVersion = packagejson.version

export async function checkForUpdate() {
  if (!packagejson.version) {
    return null
  }

  const releases = await getReleases()
  if (!releases.length) {
    console.error('No releases found')
    return null
  }

  const currentVersion = releases.find((release) => release.version == packagejson.version)
  if (!currentVersion) {
    console.error('Current version not found in releases')
    return null
  }

  const latestVersion = releases[0]
  const currentVersionMinor = currentVersion.minor
  const currentVersionMajor = currentVersion.major
  // Show all releases with the same minor version and lower or equal total version
  const releasesToShow = releases.filter((release) => {
    return release.major == currentVersionMajor && release.minor == currentVersionMinor && release.total <= currentVersion.total
  })

  return {
    hasUpdate: latestVersion.total > currentVersion.total,
    latestVersion: latestVersion.version,
    githubTagUrl: `https://github.com/advplyr/audiobookshelf/releases/tag/v${latestVersion.version}`,
    currentVersion: currentVersion.version,
    releasesToShow
  }
}