from common import get_env_variable
from src.interface.python_project import (
    PythonProjectInterface,
    custom_unit_test,
    get_aws_client,
    get_bastion_instance,
    get_credentials,
    get_environment,
    get_environments,
    sync_dags_bastion,
    sync_folder,
    sync_gx_folder,
)

DAGS_DIR = "dags"
SPARK_JOBS_DIR = "spark_jobs"
GX_DIR = "data-quality/gx"
WORK_BUCKET_NAME = "senior-datalake-artifacts"
GX_BUCKET_NAME = "senior-datalake-data-quality-artifacts"
ENVIRONMENT = get_environment()
SUFFIX = ".py"
GX_SUFFIXES = (".json", "great_expectations.yml")
PROJECT_NAME = get_env_variable("CI_PROJECT_NAME")


class PythonAppSdp(PythonProjectInterface):
    """
    Classe para gerenciar o projeto Python do SDP (Senior Data Platform).
    """

    def __init__(self):
        super().__init__()

        self.work_bucket_name = WORK_BUCKET_NAME
        self.gx_bucket_name = GX_BUCKET_NAME
        self.project_prefix = PROJECT_NAME.split("-")[0]
        self.credentials = get_credentials(ENVIRONMENT)
        self.s3_client = get_aws_client("s3", self.credentials)
        self.ec2_client = get_aws_client("ec2", self.credentials)
        self.ssm_client = get_aws_client("ssm", self.credentials)

        if ENVIRONMENT != "prod":
            self.work_bucket_name = f"{WORK_BUCKET_NAME}-{ENVIRONMENT}"
            self.gx_bucket_name = f"{GX_BUCKET_NAME}-{ENVIRONMENT}"

    def compile(self) -> None:
        pass

    def package(self):
        """
        Sincroniza os arquivos do diretório DAGS_DIR e SPARK_JOBS_DIR para o bucket S3 e sincroniza as dags com o kubernets.
        """
        sync_folder(DAGS_DIR, self.work_bucket_name, "airflow", self.s3_client, SUFFIX)
        sync_folder(SPARK_JOBS_DIR, self.work_bucket_name, "", self.s3_client, SUFFIX)
        sync_gx_folder(
            GX_DIR,
            self.gx_bucket_name,
            f"great-expectations/{self.project_prefix}",
            self.s3_client,
            GX_SUFFIXES,
        )

        bastion_instance = get_bastion_instance(self.ec2_client, ENVIRONMENT)
        sync_dags_bastion(self.ssm_client, bastion_instance, self.work_bucket_name)

    def unit_test(self) -> None:
        """
        Executa os testes unitários
        """

        if self.buildable_project.skip_build():
            return

        custom_unit_test(environments=get_environments(), source=".")
