import {
  GitHubRelease,
  parse_requested_sdl_version,
  SdlVersion,
  SdlRelease,
  SdlReleaseDb,
  SdlReleaseType,
} from "./version";

import { describe, expect, test } from "@jest/globals";

const GH_RELEASE_OUTPUT = ""
  + "3.1.1\tLatest\tprerelease-3.1.1\t2023-12-25T18:45:17Z\n"
  + "2.28.0\tLatest\trelease-2.28.0\t2023-06-20T18:45:17Z\n"
  + "2.28.0 RC1\tPre-release\tprerelease-2.27.1\t2023-06-14T03:59:14Z\n"
  + "2.26.5\t\trelease-2.26.5\t2023-04-05T19:35:40Z\n"
  + "2.26.4\t\trelease-2.26.4\t2023-03-07T00:17:02Z\n"
  + "2.26.3\t\trelease-2.26.3\t2023-02-06T23:31:56Z\n"
  + "2.26.2\t\trelease-2.26.2\t2023-01-03T15:08:11Z\n"
  + "2.26.1\t\trelease-2.26.1\t2022-12-01T20:33:11Z\n"
  + "2.26.0\t\trelease-2.26.0\t2022-11-22T00:28:26Z\n"
  + "2.26.0 RC1\tPre-release\tprerelease-2.25.1\t2022-11-17T17:49:02Z\n"
  + "2.24.2\t\trelease-2.24.2\t2022-11-01T13:39:15Z\n"
  + "2.24.1\t\trelease-2.24.1\t2022-10-05T00:16:33Z\n"
  + "2.24.0\t\trelease-2.24.0\t2022-08-19T16:04:03Z\n"
  + "2.0.22\t\trelease-2.0.22\t2022-04-25T19:20:25Z\n"
  + "2.0.20\t\trelease-2.0.20\t2022-01-11T01:03:58Z\n"
  + "2.0.18\t\trelease-2.0.18\t2021-11-30T17:15:42Z\n"
  + "2.0.16\t\trelease-2.0.16\t2021-08-10T16:03:15Z\n"
  + "2.0.14\t\trelease-2.0.14\t2021-07-08T17:14:16Z\n"
  + "2.0.12\t\trelease-2.0.12\t2022-05-24T22:37:24Z\n"
  + "2.0.10\t\trelease-2.0.10\t2022-05-24T22:35:08Z\n"
  + "2.0.9\t\trelease-2.0.9\t2022-05-24T22:33:03Z\n"
  + "2.0.8\t\trelease-2.0.8\t2022-05-23T22:20:21Z\n"
;

describe("testing parsing of version string", () => {
  function add_parse_to_version_test(
    input: string,
    major: number,
    minor: number,
    patch: number,
    type: SdlReleaseType
  ) {
    test(`test ${input}`, () => {
      const result = parse_requested_sdl_version(input);
      expect(result).toBeTruthy();
      if (result) {
        expect(result.version).toStrictEqual(
          new SdlVersion({ major: major, minor: minor, patch: patch })
        );
        expect(result.type).toStrictEqual(type);
      }
    });
  }
  function add_invalid_version_test(input: string) {
    test(`test ${input}`, () => {
      const result = parse_requested_sdl_version(input);
      expect(result).toBeNull();
    });
  }

  add_parse_to_version_test("2-any", 2, 0, 0, SdlReleaseType.Any);
  add_parse_to_version_test("sdl2-any", 2, 0, 0, SdlReleaseType.Any);
  add_parse_to_version_test("SDL2-any", 2, 0, 0, SdlReleaseType.Any);
  add_parse_to_version_test("3-any", 3, 0, 0, SdlReleaseType.Any);
  add_parse_to_version_test("SDL3-any", 3, 0, 0, SdlReleaseType.Any);
  add_parse_to_version_test("sdl3-any", 3, 0, 0, SdlReleaseType.Any);

  add_parse_to_version_test("2-head", 2, 0, 0, SdlReleaseType.Head);
  add_parse_to_version_test("sdl2-head", 2, 0, 0, SdlReleaseType.Head);
  add_parse_to_version_test("SDL2-head", 2, 0, 0, SdlReleaseType.Head);
  add_parse_to_version_test("3-head", 3, 0, 0, SdlReleaseType.Head);
  add_parse_to_version_test("SDL3-head", 3, 0, 0, SdlReleaseType.Head);
  add_parse_to_version_test("sdl3-head", 3, 0, 0, SdlReleaseType.Head);

  add_parse_to_version_test("2-latest", 2, 0, 0, SdlReleaseType.Latest);
  add_parse_to_version_test("sdl2-latest", 2, 0, 0, SdlReleaseType.Latest);
  add_parse_to_version_test("SDL2-latest", 2, 0, 0, SdlReleaseType.Latest);
  add_parse_to_version_test("3-latest", 3, 0, 0, SdlReleaseType.Latest);
  add_parse_to_version_test("SDL3-latest", 3, 0, 0, SdlReleaseType.Latest);
  add_parse_to_version_test("sdl3-latest", 3, 0, 0, SdlReleaseType.Latest);

  add_parse_to_version_test("2.22.1", 2, 22, 1, SdlReleaseType.Exact);
  add_parse_to_version_test("2.0.18", 2, 0, 18, SdlReleaseType.Exact);
  add_parse_to_version_test("3.2.0", 3, 2, 0, SdlReleaseType.Exact);
  add_parse_to_version_test("3.2.2", 3, 2, 2, SdlReleaseType.Exact);
  add_parse_to_version_test("SDL2.22.1", 2, 22, 1, SdlReleaseType.Exact);
  add_parse_to_version_test("SDL2.0.18", 2, 0, 18, SdlReleaseType.Exact);
  add_parse_to_version_test("SDL3.2.0", 3, 2, 0, SdlReleaseType.Exact);
  add_parse_to_version_test("SDL3.2.2", 3, 2, 2, SdlReleaseType.Exact);

  add_invalid_version_test("f168f9c81326ad374aade49d1dc46f245b20d07a");
  add_invalid_version_test("main");
  add_invalid_version_test("SDL2");
});

describe("test finding a release", () => {
  const github_releases = GitHubRelease.from_gh_output(GH_RELEASE_OUTPUT);
  const sdl_release_db = SdlReleaseDb.create(github_releases);
  expect(sdl_release_db.releases).toBeTruthy();

  test(`test finding exact 2.0.22 release`, () => {
    const v = new SdlVersion({ major: 2, minor: 0, patch: 22 });
    const rel = sdl_release_db.find(v, true, SdlReleaseType.Exact);
    expect(rel).not.toBeNull();
    if (rel) {
      expect(rel.version).toStrictEqual(v);
      expect(rel.prerelease).toBeFalsy();
    }
  });

  test(`test finding exact 2.26.1 release`, () => {
    const v = new SdlVersion({ major: 2, minor: 26, patch: 1 });
    const rel = sdl_release_db.find(v, true, SdlReleaseType.Exact);
    expect(rel).not.toBeNull();
    if (rel) {
      expect(rel.version).toStrictEqual(v);
      expect(rel.prerelease).toBeFalsy();
    }
  });

  test(`test finding latest 2 release`, () => {
    const v = new SdlVersion({ major: 2, minor: 0, patch: 0 });
    const rel = sdl_release_db.find(v, true, SdlReleaseType.Latest);
    expect(rel).not.toBeNull();
    if (rel) {
      // 2.26.5 exists, so the result must be > 2.26.4
      expect(rel.version.compare(new SdlVersion("2.26.4"))).toBeLessThan(0);
      expect(rel.version.major).toBe(2);
    }
  });

  test(`test finding latest non-prerelease 2 release`, () => {
    const v = new SdlVersion({ major: 2, minor: 0, patch: 0 });
    const rel = sdl_release_db.find(v, false, SdlReleaseType.Latest);
    expect(rel).not.toBeNull();
    if (rel) {
      // 2.26.5 exists, so the result must be > 2.26.4
      expect(rel.version.compare(new SdlVersion("2.26.4"))).toBeLessThan(0);
      expect(rel.version.major).toBe(2);
      expect(rel.prerelease).toBeFalsy();
    }
  });

  test(`test finding any 2 release`, () => {
    const v = new SdlVersion({ major: 2, minor: 0, patch: 0 });
    const rel = sdl_release_db.find(v, true, SdlReleaseType.Any);
    expect(rel).not.toBeNull();
    if (rel) {
      // 2.26.5 exists, so the result must be > 2.26.4
      expect(rel.version.major).toBe(2);
    }
  });

  test(`test finding any 3 release`, () => {
    const v = new SdlVersion({ major: 3, minor: 0, patch: 0 });
    const rel = sdl_release_db.find(v, true, SdlReleaseType.Any);
    expect(rel).not.toBeNull();
    if (rel) {
      // FIXME: Only 3.0.0-prerelease exists at the moment
      expect(rel.version.compare(new SdlVersion("3.0.0"))).toBeLessThanOrEqual(
        0
      );
      expect(rel.version.major).toBe(3);
    }
  });
});
