#!/usr/bin/env python3
#
# Copyright (c) 2021 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: Apache-2.0

from sys import version
from unittest import TestCase, main
from pathlib import Path
from subprocess import Popen, PIPE
from datetime import date, timedelta
from re import escape

p_script_dir = Path(__file__).absolute().parents[0]
p_root = p_script_dir.parents[1]
p_VERSION = p_root / "zcbor" / "VERSION"
p_release_notes = p_root / "RELEASE_NOTES.md"
p_migration_guide = p_root / "MIGRATION_GUIDE.md"
p_HEAD_REF = p_script_dir / "HEAD_REF"


class VersionTest(TestCase):
    def test_version_num(self):
        """For release branches - Test that all version numbers have been updated."""
        current_branch = Popen(['git', 'branch', '--show-current'],
                               stdout=PIPE).communicate()[0].decode("utf-8").strip()
        if not current_branch:
            current_branch = p_HEAD_REF.read_text(encoding="utf-8")
        self.assertRegex(
            current_branch, r"release/\d+\.\d+\.\d+",
            "This test is meant to be run on a release branch on the form 'release/x.y.z'.")

        version_number = current_branch.replace("release/", "")
        version_number_no_bugfix = ".".join(version_number.split(".")[:-1])
        self.assertRegex(
            version_number, r'\d+\.\d+\.(?!99)\d+',
            "Releases cannot have the x.y.99 development bugfix release number.")
        self.assertEqual(
            version_number, p_VERSION.read_text(encoding="utf-8"),
            f"{p_VERSION} has not been updated to the correct version number.")
        tomorrow = date.today() + timedelta(days=1)
        self.assertRegex(
            p_release_notes.read_text(encoding="utf-8").splitlines()[0],
            escape(r"# zcbor v. " + version_number)
            + fr" \(({date.today():%Y-%m-%d}|{tomorrow:%Y-%m-%d})\)",
            f"{p_release_notes} has not been updated with the correct version number or date.")
        self.assertRegex(
            p_migration_guide.read_text(encoding="utf-8").splitlines()[0],
            escape(r"# zcbor v. " + version_number_no_bugfix) + r"\.\d",
            f"{p_migration_guide} has not been updated with the correct minor/major version num.")

        tags_stdout, _ = Popen(['git', 'tag'], stdout=PIPE).communicate()
        tags = tags_stdout.decode("utf-8").strip().splitlines()
        self.assertNotIn(
            version_number, tags,
            "Version number already exists as a tag. Has the version number been updated?")


if __name__ == "__main__":
    main()
