from typing import Optional

from aws.constants import AWS_SECRET_MANAGER_DEFAULT_REGION, ENVS


def get_env_config(env_name: str) -> dict:
    env_config = ENVS.get(env_name)
    if not env_config:
        raise ValueError(f"env {env_name} not defined in aws.constants ENVS")
    return env_config


def get_env_region(env_name: str) -> str:
    env_config = get_env_config(env_name)
    region = env_config.get("aws_region")
    if not region:
        raise ValueError(f"aws_region not configured for {env_name} in aws.constants ENVS")
    return region


def get_env_account(env_name: str) -> str:
    env_config = get_env_config(env_name)
    account = env_config.get("aws_account")
    if not account:
        raise ValueError(f"aws_account not configured for {env_name} in aws.constants ENVS")
    return account


def get_env_ecr_url(env_name: str) -> str:
    env_config = get_env_config(env_name)
    ecr_url = env_config.get("ecr_url", None)
    return ecr_url


def get_buckets(env_name: str) -> str:
    env_config = get_env_config(env_name)
    buckets = env_config.get("buckets")
    if not buckets:
        raise ValueError(f"buckets not configured for {env_name} in aws.constants ENVS")
    return buckets


def get_env_bucket(env_name: str) -> str:
    buckets = get_buckets(env_name)
    env_files_bucket = buckets.get("env_files")
    if not env_files_bucket:
        raise ValueError(f"env_files bucket  not configured for {env_name} in aws.constants ENVS")
    return env_files_bucket


def get_svc_static_bucket(env_name: str, svc_name: str, scope: Optional[str] = None) -> str:
    checkpoint_scope_suffix = "_cp"
    scope_suffix = ""
    svc_name_in_bucket_data = svc_name
    if svc_name == "webclient-launcher":
        scope_suffix = checkpoint_scope_suffix
        svc_name_in_bucket_data += scope_suffix
        svc_name_in_bucket_data = svc_name_in_bucket_data.replace("-", "_")
    elif scope:
        scope_suffix = scope
        svc_name_in_bucket_data += scope_suffix
    buckets = get_buckets(env_name)
    static_bucket = buckets.get(svc_name_in_bucket_data)
    if not static_bucket:
        raise ValueError(
            f"static content bucket for {svc_name} in {env_name} with scope '{scope}' "
            f"is undefined in aws.constants ENVS. Tried to find {svc_name_in_bucket_data} key/val"
        )
    return static_bucket


def get_fe_expected_static_bucket(
    svc_name: str, env_name: str, scope: Optional[str] = None, organization: str = "p81"
) -> str:
    env_name_part = "prod-qsase" if env_name == "production-eu" else env_name
    static_bucket = f"{organization}-{env_name_part}-fe-static-content-{svc_name}"
    if scope:
        static_bucket += f"-{scope}"
    return static_bucket


def get_secret_manager_region(env_name: str) -> str:
    secret_manager_region = AWS_SECRET_MANAGER_DEFAULT_REGION
    if not env_name:
        return secret_manager_region
    if env_name.startswith(("production-", "splinter")):
        secret_manager_region = get_env_region(env_name)
    if not secret_manager_region:
        raise ValueError(f"secret manager region for {env_name} couldn't be retrieved")
    return secret_manager_region
