import datetime, os, requests
from functions import get_commit_id, get_reviewers, extract_release_numbers_data, cherry_pick, create_pr, get_labels, get_pr_title_body, issue_comment, push_to_branch
from vars import headers, upstream_repo, input_data

triggered_on = os.environ["INPUT_TRIGGERED_ON"]
pr_number = os.environ["INPUT_PR_NUMBER"] if triggered_on == "closed" else os.environ["INPUT_PR_NUMBER"].split("#")[1]
milestone_title = os.environ["INPUT_MILESTONE_TITLE"]
milestoned_issue_number = os.environ["INPUT_MILESTONED_ISSUE_NUMBER"]

issue_data = requests.get(f"https://api.github.com/repos/{input_data['api_repo_name']}/issues/{pr_number}", headers=headers).json()

# Check if the PR is closed.
if issue_data["state"] != "closed":
    print(f'The PR #{pr_number} is not closed yet.')
    raise SystemExit(0)

# Retrieve commit_id. If the PR/issue has no commit or has multiple commits, then raise an error.
commit_id = get_commit_id(pr_number, input_data["actor_name"], input_data["action_event"], input_data["api_repo_name"])

# Retrieve approvers(reviewers) of the PR
reviewers = get_reviewers(pr_number, input_data["api_repo_name"], issue_data)

# Retrieve release_numbers
if triggered_on == "closed":
    release_numbers_data = extract_release_numbers_data(pr_number, input_data["api_repo_name"])
elif triggered_on == "commented":
    release_numbers_data = {milestone_title.split(" release blockers")[0]: milestoned_issue_number}

# Retrieve labels
labels = get_labels(pr_number, input_data["api_repo_name"])

# Retrieve issue/PR's title and body
pr_title_body = get_pr_title_body(commit_id, input_data["api_repo_name"])

# Perform cherry-pick and then create a pr if it's successful.
requires_clone = True
for k in release_numbers_data.keys():
    release_number = k
    release_branch_name = f"{input_data['release_branch_name_initials']}{release_number}"
    target_branch_name = f"cp{pr_number}-{release_number}-{datetime.datetime.now().strftime('%H%M%S')}"
    issue_number = release_numbers_data[k]
    pr_title = pr_title_body["title"]
    pr_body = pr_title_body["body"]
    try:
        cherry_pick(commit_id, release_branch_name, target_branch_name, requires_clone, True, input_data)
        push_to_branch(target_branch_name)
        cherry_picked_pr_number = create_pr(reviewers, release_number, labels, pr_title, pr_body, release_branch_name, target_branch_name, input_data["user_name"])
        issue_comment(issue_number, f"Cherry-picked in https://github.com/{upstream_repo}/pull/{cherry_picked_pr_number}", input_data["api_repo_name"], input_data["is_prod"])
    except Exception as e:
        issue_comment(issue_number, str(e), input_data["api_repo_name"], input_data["is_prod"])
    requires_clone = False
