import os
import sys

import requests
from dataclasses import dataclass


git_token = os.getenv('GLOBAL_CICD_GIT_TOKEN')
git_headers = {
    'Accept': 'application/vnd.github.v3+json',
    'Authorization': f'token {git_token}',
    'Content-Type': 'application/x-www-form-urlencoded',
}


@dataclass(frozen=True)
class Version:
    major: int
    minor: int
    patch: int

    def __str__(self):
        return f"v{self.major}.{self.minor}.{self.patch}"

    def __repr__(self):
        return f"v{self.major}.{self.minor}.{self.patch}"

    def __gt__(self, other):
        if self.major > other.major:
            return True
        else:
            if self.major == other.major:
                if self.minor > other.minor:
                    return True
                else:
                    if self.minor == other.minor:
                        if self.patch > other.patch:
                            return True
        return False


def get_version(version: str):
    parts = version[1:].split(".")
    if len(parts) != 3:
        return None
    else:
        return Version(int(parts[0]), int(parts[1]), int(parts[2]))


def get_git_high_tags(repo):
    try:
        git_url = f"https://api.github.com/repos/{repo}/tags"
        response = requests.get(git_url, headers=git_headers)
        tags = []
        for tag in response.json():
            tag_name = tag['name']
            try:
                version_tag = get_version(tag_name)
                if version_tag:
                    tags.append(version_tag)
            except:
                pass
        high_tag = max(tags)
        return high_tag
    except Exception as e:
        print(f"error in get git high tags- {e}")
        print(response.text)


def get_git_tags(repo):
    try:
        git_url = f"https://api.github.com/repos/perimeter-81/{repo}/tags"
        response = requests.get(git_url, headers=git_headers)
        tags = []
        for tag in response.json():
            tags.append(tag['name'])
        return tags
    except Exception as e:
        print(f"error in get git tags- {e}")
        print(response.text)


def get_last_hotfix(hotfix_tags):
    high_ver = 1
    for version in hotfix_tags:
        if "hotfix" in version:
            small_version = int(version.split('-')[-1])
            if small_version > high_ver:
                high_ver = small_version
    return high_ver


if len(sys.argv) > 1:
    full_repo_name = sys.argv[1]
else:
    full_repo_name = None
# bin_repo_name = subprocess.check_output('basename -s .git $(git config --get remote.origin.url)', shell=True)
# repo_name = bin_repo_name.decode()[:-1]
print(f'repo name: {full_repo_name}')


version = get_git_high_tags(full_repo_name)
if not version:
    os.system(f'''echo ":stop_sign: ERROR - there is no high version" >> $GITHUB_STEP_SUMMARY''')
    exit(1)
severity = os.getenv('SEMVER_LEVEL')
print(severity)
n_version = ""
if severity == "Major":
    n_version = f"v{version.major+1}.0.0"
elif severity == "Minor":
    n_version = f"v{version.major}.{version.minor+1}.0"
else:
    n_version = f"v{version.major}.{version.minor}.{version.patch+1}"

print(f"new version: {n_version}")
os.system(f'''echo "NEW_VERSION={n_version}" >> $GITHUB_ENV''')