import * as tc from '@actions/tool-cache';

import semver from 'semver';

import BaseDistribution from './base-distribution.js';
import {NodeInputs} from './base-models.js';

export default abstract class BasePrereleaseNodejs extends BaseDistribution {
  protected abstract distribution: string;
  constructor(nodeInfo: NodeInputs) {
    super(nodeInfo);
  }

  protected findVersionInHostedToolCacheDirectory(): string {
    let toolPath = '';
    const localVersionPaths = tc
      .findAllVersions('node', this.nodeInfo.arch)
      .filter(i => {
        const prerelease = semver.prerelease(i, {});
        if (!prerelease) {
          return false;
        }

        return prerelease[0].toString().includes(this.distribution);
      });
    localVersionPaths.sort(semver.rcompare);
    const localVersion = this.evaluateVersions(localVersionPaths);
    if (localVersion) {
      toolPath = tc.find('node', localVersion, this.nodeInfo.arch);
    }

    return toolPath;
  }

  protected validRange(versionSpec: string) {
    let range: string;
    const [raw, prerelease] = this.splitVersionSpec(versionSpec);
    const isValidVersion = semver.valid(raw);
    const rawVersion = (isValidVersion ? raw : semver.coerce(raw))!;

    if (prerelease !== this.distribution) {
      range = versionSpec;
    } else {
      range = `${semver.validRange(`^${rawVersion}-${this.distribution}`)}-0`;
    }

    return {range, options: {includePrerelease: !isValidVersion}};
  }

  protected splitVersionSpec(versionSpec: string) {
    return versionSpec.split(/-(.*)/s);
  }
}
