from actions_logging.app_logging import logger
from common.common import raise_with_context
from github.constants import GH_URL
from github.github_apis import get_team_members, request_reviewers
from github.slack_user_link import get_slack_user_by_github_user
from slack_wrapper.message import send_message_on_slack


def add_requested_reviewers(
    repo: str,
    pr_number: int,
    reviewers: list,
    team_reviewers: list = [],
):
    """
    Add requested reviewers to a pull request and send them a Slack message.

    :param repo: The repository name in the format 'owner/repo'.
    :param pr_number: The pull request number.
    :param reviewers: A list of GitHub usernames to be added as reviewers.
    :param team_reviewers: An optional list of team names in the format 'org/team' to add as reviewers.
    """

    try:
        if request_reviewers(repo=repo, pr_number=pr_number, reviewers=reviewers, team_reviewers=team_reviewers):
            logger.info(f"Sending Slack message to reviewers {reviewers} for PR #{pr_number}")
            pr_url = f"{GH_URL}/{repo}/pull/{pr_number}"

            if team_reviewers:
                logger.debug(f"Resolving team members of {team_reviewers}")
                for handle in team_reviewers:
                    for team_member in get_team_members(handle.split("/")[1]):
                        logger.debug(f"Adding team member {team_member} to reviewers")
                        reviewers.append(team_member)

            reviewers = list(set(reviewers))  # Remove duplicates
            for reviewer in reviewers:
                try:
                    slack_user = get_slack_user_by_github_user(reviewer)
                    if slack_user:
                        slack_user_name = slack_user.get("name", reviewer)
                        slack_message_text = "PR #{pr_number} was created in repository {repo} for you to review."
                        slack_message_markdown_text = (
                            f"Greetings, {slack_user_name}!\n\n"
                            f"🚀 [PR #{pr_number}]({pr_url}) was created in repository {repo} 📦\n\n"
                            "As a code owner for the repository, you are being requested to review it.\n\n"
                        )
                        logger.debug(f"Sending Slack DM to {reviewer}: {slack_message_markdown_text}")

                        send_message_on_slack(slack_user["id"], slack_message_text, slack_message_markdown_text)
                except Exception as e:
                    logger.error(f"Failed to send Slack message to {reviewer} for PR #{pr_number}: {e}")
    except Exception as e:
        raise_with_context(e)
