import boto3
import botocore
import os
from actions_logging.app_logging import logger
from github.env import get_required_env_var, write_github_env
from aws.constants import PROD_ENVS, PRODUCTION
from aws.env_info import get_secret_manager_region


def get_secret_client(region):
    try:
        return boto3.client("secretsmanager", region_name=region)
    except Exception as e:
        logger.error("An error occurred:", e)
        logger.error("exiting without dropping the pipeline")
        exit(0)


def check_if_secret_exists(client, secret_id):
    logger.info(f"checking if {secret_id} is exist")
    try:
        client.describe_secret(SecretId=secret_id)
        return True
    except client.exceptions.ResourceNotFoundException:
        logger.warning(f"Secret {secret_id} does not exist")
        return False
    except Exception as e:
        logger.error("An error occurred:", e)
        return False


def main():
    try:
        logger.info_green("start describing the secrets")
        env_name = os.getenv('ENV_NAME')
        region = get_secret_manager_region(env_name)
        env_level = env_name
        if env_name in PROD_ENVS:
            env_level = PRODUCTION
        write_github_env(region, 'AWS_SECRET_REGION')
        secrets_vars_names_and_paths = {
            "SECRET_ENV_NAME": None,
            "SECRET_GLOBAL_SVC": None,
            "SECRET_ENV_SVC": None
        }
        logger.info_green(f"for {env_name} secrets are located in {region}, injected as AWS_SECRET_REGION")
        svc = os.getenv('SVC_NAME')
        if svc:
            logger.info(f"svc name is {svc} - will check secrets in global/{svc}")
            secrets_vars_names_and_paths["SECRET_GLOBAL_SVC"] = f"global/{svc}"
        if env_name:
            logger.info(f"env name is {env_name} - will check secrets in env/{env_level}")
            secrets_vars_names_and_paths["SECRET_ENV_NAME"] = f"env/{env_level}"
        if env_name and svc:
            logger.info(f"svc name is {svc} and env name is {env_name} - will check secrets in env/{env_level}/{svc}")
            secrets_vars_names_and_paths["SECRET_ENV_SVC"] = f"env/{env_level}/{svc}"
        client = get_secret_client(region)

        for secret_key_name in secrets_vars_names_and_paths:
            secret_path = secrets_vars_names_and_paths.get(secret_key_name)
            if secret_path and check_if_secret_exists(client, secret_path):
                logger.info(f"{secret_path} is exist")
                write_github_env(secret_path, secret_key_name)
    except Exception as e:
        logger.error("An error occurred:", e)


if __name__ == '__main__':
    main()
