import datetime, os, re
from vars import input_data, upstream_repo, cherrypick_with_commits_infos
from functions import cherry_pick, create_pr, issue_comment, get_pr_title_body, PushCpException, push_to_branch, get_middle_text

milestone_title = os.environ["INPUT_MILESTONE_TITLE"]
milestoned_issue_number = os.environ["INPUT_MILESTONED_ISSUE_NUMBER"]
issue_title = os.environ['INPUT_ISSUE_TITLE']
issue_body = os.environ["INPUT_ISSUE_BODY"]
commits_text = cherrypick_with_commits_infos["commits"]
team_labels_text = cherrypick_with_commits_infos["team_labels"]
reviewers_text = cherrypick_with_commits_infos["reviewers"]
issue_body_dict = {}
issue_body_dict["commits"] = get_middle_text(issue_body, commits_text["left"], commits_text["right"]).replace(" ", "").split(",")

for commit_index in range(len(issue_body_dict["commits"])):
    issue_body_dict["commits"][commit_index] = re.sub(r'https://.*/commit/', "", issue_body_dict["commits"][commit_index])

issue_body_dict["labels"] = get_middle_text(issue_body, team_labels_text["left"], team_labels_text["right"]).replace(" ", "").replace("@", "").split(",")
issue_body_dict["reviewers"] = get_middle_text(issue_body, reviewers_text["left"], reviewers_text["right"]).replace(" ", "").replace("@", "").split(",")

release_number = milestone_title.split(" release blockers")[0]
release_branch_name = f"{input_data['release_branch_name_initials']}{release_number}"
target_branch_name = f"cp_ondemand_{milestoned_issue_number}-{release_number}-{datetime.datetime.now().strftime('%H%M%S')}"
head_branch_name = f"{input_data['user_name']}:{target_branch_name}"
reviewers = issue_body_dict["reviewers"]
labels = issue_body_dict["labels"]
requires_clone = True
requires_checkout = True
successful_commits = []
failed_commits = []

for idx, commit_id in enumerate(issue_body_dict["commits"]):
    try:
        cherry_pick(commit_id, release_branch_name, target_branch_name, requires_clone, requires_checkout, input_data)
        msg_body = get_pr_title_body(commit_id, input_data["api_repo_name"])["body"]
        success_msg = {"commit_id": commit_id, "msg": msg_body}
        successful_commits.append(success_msg)
    except PushCpException as pe:
        issue_comment(milestoned_issue_number, str(pe), input_data["api_repo_name"], input_data["is_prod"])
        raise SystemExit(0)
    except Exception as e:
        failed_commits.append(commit_id)
    requires_clone = False
    requires_checkout = False

try:
    push_to_branch(target_branch_name)
except Exception as e:
    issue_comment(milestoned_issue_number, str(e), input_data["api_repo_name"], input_data["is_prod"])
    raise SystemExit(0)

issue_comment_body = ""
if len(successful_commits):
    if len(successful_commits) >= 2:
        pr_body = f"This PR contains {len(successful_commits)} commit(s).\n\n"
        for idx, commit in enumerate(successful_commits):
            pr_body += str((idx + 1)) + ")" + commit["msg"] + "\n\n"
    elif len(successful_commits) == 1:
        pr_body = f"{successful_commits[0]['msg']}"
    if "awaiting-review" not in labels: labels.append("awaiting-review")
    cherry_picked_pr_number = create_pr(reviewers, release_number, labels, issue_title, pr_body, release_branch_name, target_branch_name, input_data['user_name'])
    issue_comment_body = f"The following commits were cherry-picked in https://github.com/{upstream_repo}/pull/{cherry_picked_pr_number}: "
    for success_commit in successful_commits:
        issue_comment_body += f"https://github.com/{input_data['api_repo_name']}/commit/{success_commit['commit_id']}, "
    issue_comment_body = issue_comment_body[::-1].replace(" ,", ".", 1)[::-1]

    if len(failed_commits):
        failure_commits_str = f"\nFailed commits (likely due to merge conflicts): "
        for fail_commit in failed_commits:
            failure_commits_str += f"https://github.com/{input_data['api_repo_name']}/commit/{fail_commit}, "
        failure_commits_str = failure_commits_str[::-1].replace(" ,", "", 1)[::-1]
        failure_commits_str += "\n\nThe failed commits are NOT included in the PR. Please resolve manually.\ncc: @bazelbuild/triage"
        issue_comment_body += failure_commits_str
elif len(failed_commits):
    issue_comment_body = "Failed commits (likely due to merge conflicts): "
    for fail_commit in failed_commits:
        issue_comment_body += f"https://github.com/{input_data['api_repo_name']}/commit/{fail_commit}, "
    issue_comment_body = issue_comment_body[::-1].replace(" ,", ".", 1)[::-1] + "\nPlease resolve manually.\ncc: @bazelbuild/triage"
issue_comment(milestoned_issue_number, issue_comment_body, input_data["api_repo_name"], input_data["is_prod"])
