import os
import sys
import requests
import pyfiglet

git_token = os.getenv('GLOBAL_CICD_GIT_TOKEN')
git_url = "https://api.github.com/repos"
headers = {
    'Accept': 'application/vnd.github+json',
    'Authorization': f'Bearer {git_token}',
    'X-GitHub-Api-Version': '2022-11-28',
    'Content-Type': 'application/x-www-form-urlencoded',
}


def list_workflows(repo_name):
    response = requests.get(
        f'{git_url}/{repo_name}/actions/workflows', headers=headers
    )
    res_json = response.json()
    print("listed workflow")
    return res_json


def run_workflow(workflow_id, branch, env, docker_tag, env_prefix_to_trigger):
    not_run_ecs = os.getenv("NOT_RUN_UPDATE_ECS", "")
    if branch == "DevOps":
        print("deploying to devops branch")
        data = {
            "ref": branch,
            "inputs": {
                "ENV_NAME": env,
                "VERSION_TO_DEPLOY": docker_tag,
                "NOT_RUN_UPDATE_ECS": not_run_ecs,
                "env_prefix": env_prefix_to_trigger
            }
        }
    else:
        data = {
            "ref": branch,
            "inputs": {
                "ENV_NAME": env,
                "VERSION_TO_DEPLOY": docker_tag,
            }
        }

    

    print(data)
    response = requests.post(
        f'{git_url}/{repo_name}/actions/workflows/{workflow_id}/dispatches',
        headers=headers, json=data)
    if response.status_code == 204:
        print("workflow run")
    else:
        print(f"error in running another workflow: for repo {repo_name} ")
        os.system(f'echo ":stop_sign: could not trigger the workflow for repo {repo_name} " >> $GITHUB_STEP_SUMMARY')
        print(response.status_code)
        print(response.json())
        exit(1)


def find_latest_workflow_run_id(workflow_id, repo_name):
    response = requests.get(f'{git_url}/{repo_name}/actions/workflows/{workflow_id}/runs', headers=headers)
    if response.status_code == 200:
        data = response.json()
        workflow_runs = data.get('workflow_runs', [])
        # print(workflow_runs)
        if workflow_runs:
            # Sort the runs by the 'created_at' timestamp in descending order
            sorted_runs = sorted(workflow_runs, key=lambda x: x['created_at'], reverse=True)
            latest_run = sorted_runs[0]
            return latest_run['id']
        else:
            print("No workflow runs found.")
            return None
    else:
        print(f"Error in getting workflow runs: for repo {repo_name}")
        print(response.status_code)
        print(response.json())
        #exit(1)
        return None


def find_right_workflow(workflow_name, workflows):
    if workflows.get('workflows'):
        for workflow in workflows['workflows']:
            if workflow.get('path'):
                file_name = workflow['path'].replace('.github/workflows/', '').replace('.yaml', '').replace('.yml', '')
                if file_name == workflow_name:
                    workflow_id = workflow['id']
                    print("workflow id found")
                    return workflow_id


def print_big_arrow():
    result = pyfiglet.figlet_format("WORKFLOW LINK")
    print(result)


def get_run_link(latest_run_id):
    response = requests.get(f'{git_url}/{repo_name}/actions/runs/{latest_run_id}', headers=headers)
    
    if response.status_code == 200:
        data = response.json()
        print("workflow triggered successfully")
        return data["html_url"]
    else:
        print("Error in getting workflow run status:")
        print(response.status_code)
        print(response.json())
        return None


workflow_name = sys.argv[1].replace("workflow_name=", "", 1)
repo_name = sys.argv[2].replace("repo_name=", "", 1)
if repo_name == "":
    repo_name = os.getenv('GITHUB_REPOSITORY')

docker_tag = os.getenv('VERSION_TO_DEPLOY')
branch = os.getenv('DEFAULT_BRANCH') or os.getenv('GITHUB_REF')
print(f"branch name: {branch}")
env_name = os.getenv('ENV_NAME')
workflows = list_workflows(repo_name)
workflow_id = find_right_workflow(workflow_name, workflows)
latest_run_id = find_latest_workflow_run_id(workflow_id, repo_name)
env_prefix = os.getenv("env_prefix", "")
env_prefix_to_trigger = env_prefix
if env_prefix == "qa":
    env_prefix = "-qa"
else:
    env_prefix = ""
run_workflow(workflow_id, branch, env_name, docker_tag, env_prefix_to_trigger)

have_started = False
while not have_started:
    latest_latest_run_id = find_latest_workflow_run_id(workflow_id, repo_name)
    if latest_latest_run_id != latest_run_id:
        have_started = True
        latest_run_id = latest_latest_run_id
    print("~ still same")
print("not same anymore.........")

print(latest_run_id)
run_url = get_run_link(latest_run_id)
os.system(f'echo ":running_man:	 the deployment of the version: {docker_tag} to env: {env_name} in repo: {repo_name} is in [this workfkow]({run_url})" >> $GITHUB_STEP_SUMMARY')
print("\n\n\nlink to the triggered workflow")
print_big_arrow()
print(run_url)