"""
Utilitários para interagir com o CloudFormation, incluindo validação e empacotamento de templates.
"""

from __future__ import annotations

from pathlib import Path

from colorama import Fore

from common import print_message
from src.datalake.commons.aws_utils import (
    configure_aws_access,
    install_aws_dependencies,
    make_client,
    make_session,
)
from src.datalake.commons.ci_utils import require_env, run_cmd


def cloudformation_validate(env: dict[str, str]) -> None:
    """
    Valida o template do CloudFormation.

    Args:
        env (dict[str, str]): Dicionário contendo variáveis de ambiente necessárias para a validação do template.

    Raises:
        RuntimeError: Se o arquivo template.yaml não for encontrado.

    """
    print_message(f"{Fore.YELLOW}[Dados] cloudformation - validate")
    configure_aws_access(env, force=True)

    template_file = Path("template.yaml")
    if not template_file.exists():
        raise RuntimeError("[Dados] template.yaml não encontrado")

    session = make_session(env)
    cf = make_client(
        session, "cloudformation", region_name=require_env(env, "AWS_DEFAULT_REGION")
    )
    response = cf.validate_template(
        TemplateBody=template_file.read_text(encoding="utf-8")
    )
    print_message(
        f"{Fore.YELLOW}[Dados] cloudformation - validate response: {response}"
    )


def cloudformation_package(env: dict[str, str], name: str) -> None:
    """
    Empacota o template do CloudFormation usando o comando AWS CLI.

    Args:
        env (dict[str, str]): Dicionário contendo variáveis de ambiente necessárias para o empacotamento do template.
        name (str): Nome do pacote a ser criado.

    """
    # Não existe equivalente direto ao comando `aws cloudformation package` no boto3.
    # Mantemos fallback no CLI apenas para esta etapa de empacotamento.
    install_aws_dependencies()

    print_message(f"{Fore.YELLOW}[Dados] cloudformation - package")
    run_cmd(
        [
            "aws",
            "cloudformation",
            "package",
            "--template-file",
            "template.yaml",
            "--s3-bucket",
            require_env(env, "CFN_DEPLOYMENT_BUCKET"),
            "--s3-prefix",
            f"{require_env(env, 'CFN_DEPLOYMENT_PREFIX')}/{name}/package",
            "--output-template-file",
            "packaged.yaml",
            "--region",
            require_env(env, "REGION"),
            "--color",
            "on",
        ],
        env=env,
    )
