import os
import requests
from datetime import datetime
import json
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, dir_name: str):
    if dir_name not in version:
        return None
    tag = version.split(f"-{dir_name}")[0]
    print(f"tag: {tag}")
    parts = tag[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, dir_name):
    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']
            print(tag_name)
            try:
                version_tag = get_version(tag_name, dir_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/{repo}/tags"
        response = requests.get(git_url, headers=git_headers)
        tags = []
        print
        for tag in response.json():
            tags.append(tag['name'])
            print(tags)
        return tags
    except Exception as e:
        print(f"error in get git tags- {e}")
        print(response.text)


def main():
    dir_name = os.getenv("CHANGED_DIRS").replace("[", "",1).replace("]", "", 1)
    os.system(f'''echo "DIR_TO_BUILD={dir_name}" >> $GITHUB_ENV''')
    print(f"dir name {dir_name}")


    repo_name = os.getenv("REPO_NAME")
    print(f'repo name: {repo_name}')

    # os.system('git fetch --tags')
    version = get_git_high_tags(repo_name, dir_name)
    if not version:
        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}"

    n_version_no_dir = n_version
    n_version = f"{n_version}-{dir_name}"

    print(f"new version: {n_version}")
    os.system(f'''echo "VERSION_TO_DEPLOY={n_version_no_dir}" >> $GITHUB_ENV''')
    os.system(f'''echo "NEW_VERSION={n_version}" >> $GITHUB_ENV''')
    os.system(f'''echo "NEW_VERSION_NO_DIR={n_version_no_dir}" >> $GITHUB_ENV''')
    os.system(f'''echo ":trophy: new version created: **{n_version}**" >> $GITHUB_STEP_SUMMARY''')


if __name__ == "__main__":
    main()
