from actions_logging.app_logging import logger
from github.env import exit_on_error_and_write_summary, write_github_env, get_required_env_var
from github.constants import PR_EVENT_NAME, REPO_DISPATCH_EVENT_NAME, MASTER_ENV_NAME
import json


def get_pr_is_merged(context_json):
    """
    Get is_merged from github context
    github context is a json string represent the event context during the action run
    :param github_context:
    :return: bool
    """
    try:
        logger.info("Getting is_merged from github context")
        logger.debug(context_json)
        return context_json.get('event', {}).get('pull_request', {}).get('merged', False)
    except Exception as e:
        exit_on_error_and_write_summary(f"Error in get_is_merged_from_github_context: {e}")


def set_env_name_and_event_type_for_pr(context_json):
    logger.info_green("PR event. will set env name to master")
    is_merged = get_pr_is_merged(context_json)
    if not is_merged:
        exit_on_error_and_write_summary("PR was closed without merging (GitHub actions doesn't have dedicated 'merged' event), aborting execution.")
    event_type = 'merged'
    return event_type


def get_event_name_and_gh_context():
    event_name = get_required_env_var("GITHUB_EVENT_NAME")
    github_context = get_required_env_var("GITHUB_CONTEXT")
    context_json = json.loads(github_context)
    logger.debug(f"github_context: \n{context_json}")
    return event_name, context_json


def main():
    try:
        env_name = ""
        version_to_deploy = ""
        env_file_version = ""
        event_type = ""
        event_name, context_json = get_event_name_and_gh_context()
        if event_name == PR_EVENT_NAME:
            env_name = MASTER_ENV_NAME
            event_type = set_env_name_and_event_type_for_pr(context_json)
        elif event_name == REPO_DISPATCH_EVENT_NAME:
            logger.info_green("Repo dispatch event, will set build artifact to false, and get version and env name from the dispatch event")
            if not context_json.get('event'):
                exit_on_error_and_write_summary("Error: event key not found in github context")
            if not context_json['event'].get('client_payload'):
                exit_on_error_and_write_summary("Error: client_payload key not found in github context")
            client_payload = context_json['event']['client_payload']
            logger.debug(f"client_payload: {client_payload}")
            env_name = client_payload.get("ENV_NAME")
            if not env_name:
                exit_on_error_and_write_summary("Error: env name not found in client payload")
            version_to_deploy = client_payload.get("VERSION_TO_DEPLOY", '').strip()
            env_file_version = client_payload.get('ENV_FILE_VERSION', '').strip()
            svc_name = client_payload.get('SVC_NAME').strip()
            if svc_name:
                write_github_env(svc_name, 'SVC_NAME') # used for lambda workflow_dispatch deployment
            if not version_to_deploy and not env_file_version:
                exit_on_error_and_write_summary("Error: version to deploy and env file version not found in client payload")
            event_type = 'deploy'
        else:
            exit_on_error_and_write_summary(f"Error: event name {event_name} is not supported")
        write_github_env(env_name, "ENV_NAME")
        write_github_env(version_to_deploy, "VERSION_TO_DEPLOY")
        write_github_env(env_file_version, "ENV_FILE_VERSION")
        write_github_env(event_type, 'EVENT_TYPE')

    except Exception as e:
        exit_on_error_and_write_summary(f"Error: {e}")


if __name__ == '__main__':
    main()
