import * as path from 'path'
import * as graalvm from '../src/graalvm'
import {expect, test} from '@jest/globals'
import {getTaggedRelease} from '../src/utils'
import {
  findGraalVMVersion,
  findHighestJavaVersion,
  findLatestEABuildDownloadUrl
} from '../src/graalvm'
import {GRAALVM_GH_USER, GRAALVM_RELEASES_REPO} from '../src/constants'

process.env['RUNNER_TOOL_CACHE'] = path.join(__dirname, 'TOOL_CACHE')
process.env['RUNNER_TEMP'] = path.join(__dirname, 'TEMP')

test('request invalid version/javaVersion', async () => {
  for (var combination of [
    ['22.3.0', '7'],
    ['22.3', '17'],
    ['22.3', '7']
  ]) {
    let error = new Error('unexpected')
    try {
      await graalvm.setUpGraalVMRelease('', combination[0], combination[1])
    } catch (err) {
      if (!(err instanceof Error)) {
        fail(`Unexpected non-Error: ${err}`)
      }
      error = err
    }

    expect(error).not.toBeUndefined()
    expect(error.message).toContain('Failed to download')
    expect(error.message).toContain('Are you sure version')
  }
})

test('find version/javaVersion', async () => {
  // Make sure the action can find the latest Java version for known major versions
  for (var majorJavaVersion of ['17', '20']) {
    await graalvm.findLatestGraalVMJDKCEJavaVersion(majorJavaVersion)
  }

  let error = new Error('unexpected')
  try {
    await graalvm.findLatestGraalVMJDKCEJavaVersion('11')
    fail('Should not find Java version for 11')
  } catch (err) {
    if (!(err instanceof Error)) {
      fail(`Unexpected non-Error: ${err}`)
    }
    error = err
  }
  expect(error.message).toContain('Unable to find the latest Java version for')

  const latestRelease = await getTaggedRelease(
    GRAALVM_GH_USER,
    GRAALVM_RELEASES_REPO,
    'vm-22.3.1'
  )
  const latestVersion = findGraalVMVersion(latestRelease)
  expect(latestVersion).not.toBe('')
  const latestJavaVersion = findHighestJavaVersion(latestRelease, latestVersion)
  expect(latestJavaVersion).not.toBe('')

  error = new Error('unexpected')
  try {
    const invalidRelease = {...latestRelease, tag_name: 'invalid'}
    findGraalVMVersion(invalidRelease)
  } catch (err) {
    if (!(err instanceof Error)) {
      fail(`Unexpected non-Error: ${err}`)
    }
    error = err
  }
  expect(error.message).toContain('Could not find latest GraalVM release:')

  try {
    findHighestJavaVersion(latestRelease, 'invalid')
  } catch (err) {
    if (!(err instanceof Error)) {
      fail(`Unexpected non-Error: ${err}`)
    }
    error = err
  }
  expect(error.message).toContain('Could not find highest Java version.')
})

test('find version/javaVersion', async () => {
  let url22EA = await findLatestEABuildDownloadUrl('22-ea')
  expect(url22EA).not.toBe('')
  let urlLatestEA = await findLatestEABuildDownloadUrl('latest-ea')
  expect(urlLatestEA).not.toBe('')

  let error = new Error('unexpected')
  try {
    await findLatestEABuildDownloadUrl('8-ea')
  } catch (err) {
    if (!(err instanceof Error)) {
      fail(`Unexpected non-Error: ${err}`)
    }
    error = err
  }
  expect(error.message).toContain('Unable to resolve download URL for')
})