import os
import boto3
from actions_logging.app_logging import logger
from common.common import run_command
from github.env import get_required_env_var, exit_on_error_and_write_summary, write_github_env
from lambdas.lambda_info import get_lambda_function_name

def update_lambda_tags(function_name: str, tags: dict, aws_region: str):
    if not function_name:
        raise ValueError(f"lambda function name must be provided")
    if not tags:
        raise ValueError(f"tags for lambda function name must be provided")
    if not aws_region:
        raise ValueError(f"region for lambda must be provided")
    try:
        lambda_client = boto3.client('lambda', region_name = aws_region)
        response = lambda_client.get_function(FunctionName=function_name)
        lambda_arn = response['Configuration']['FunctionArn']
        logger.info(f'lambda_arn: {lambda_arn}, tags: {tags}')

        response = lambda_client.tag_resource(
            Resource=lambda_arn,
            Tags=tags
        )
        logger.info(f'RESPONSE: {response}')
    except Exception as e:
        exit_on_error_and_write_summary(f'Error tagging lambda: {function_name}. Reason: {e}')

def main():
    logger.info('Starting upload lambda from s3 step.')
    lambda_zip_to_deploy = get_required_env_var('LAMBDA_ZIP_TO_UPLOAD')
    aws_region = get_required_env_var('AWS_REGION')
    s3_bucket = get_required_env_var('S3_BUCKET_FOR_LAMBDA_UPLOAD')
    svc_name = get_required_env_var('SVC_NAME')
    env_name = get_required_env_var('ENV_NAME')
    env_version = os.getenv('DEPLOYED_ENV_FILE_VERSION')
    lambda_version = os.getenv('DEPLOYED_ARTIFACT_VERSION')
    lambda_tags = {}
    try:
        function_name = get_lambda_function_name(svc_name, env_name)
        run_command(f'aws lambda update-function-code --function-name {function_name} --s3-bucket {s3_bucket} --s3-key {lambda_zip_to_deploy} --region {aws_region}')
        logger.info(f'Updating function code...{function_name}')
        logger.info('The function code is successfully updated')

        if env_version:
            lambda_tags['ENV_VERSION'] = env_version
        if lambda_version:
            lambda_tags['LAMBDA_VERSION'] = lambda_version

        if lambda_tags:
            logger.info(f'Adding tags for lambda {function_name}')
            update_lambda_tags(function_name, lambda_tags, aws_region)
            logger.info('The lambda function is successfully tagged')
        else:
            logger.info(f'No tags to update for lambda {function_name}.')
    except Exception as e:
        exit_on_error_and_write_summary(f'Error in {__file__}. Reason: {e}')


if __name__ == "__main__":
    main()