"""
Execução de invocações de Lambda a partir de um arquivo de configuração JSON/JSONC.

Este módulo fornece funções para executar invocações de funções Lambda, incluindo a resolução de ARNs de funções a
partir de nomes, carregamento de conteúdo XML de arquivos externos e validação opcional por cenário. As funções são
projetadas para serem usadas em scripts de CI/CD e automação de tarefas relacionadas ao Data Lake, garantindo que as
invocações de Lambda sejam realizadas de forma confiável e consistente, com suporte a placeholders de ambiente e
validação de resultados.

"""

from __future__ import annotations

import argparse
import json
from pathlib import Path

from common import print_message
from src.datalake.commons import lambda_utils
from src.datalake.commons.data_env import load_runtime_env


def main() -> int:
    parser = argparse.ArgumentParser(description="Lambda invoke")
    parser.add_argument("-r", action="store_true", dest="invoke")
    parser.add_argument(
        "-n", "--name", nargs="?", required=True, help="Lambda name or ARN to invoke"
    )
    parser.add_argument("-p", "--payload", nargs="?")
    parser.add_argument("-v", "--validate", action="store_true", dest="validate")
    parser.add_argument(
        "-e", "--expect_success", action="store_true", dest="expect_success"
    )
    parser.add_argument(
        "-o", "--output", dest="output", help="File to write the lambda response (JSON)"
    )
    args = parser.parse_args()

    if not args.invoke or not args.name:
        parser.print_help()
        if not args.name:
            print_message("[Dados] Nome da lambda é obrigatório")
        return 2

    result = 0
    try:
        env = load_runtime_env(apply_set_all=True, configure_aws=True)
        response = lambda_utils.invoke_lambda(
            args.name, args.payload, env, args.validate, args.expect_success
        )
        if args.output:
            response_text = json.dumps(
                response, default=str, ensure_ascii=False, indent=2
            )
            Path(args.output).write_text(response_text, encoding="utf-8")
            print_message(
                f"[Dados] lambda - invoke - resposta escrita em {args.output}"
            )
    except Exception as exc:
        print_message(str(exc))
        result = 2

    return result


if __name__ == "__main__":
    raise SystemExit(main())
