import asyncio
import os
from aws.constants import EXCLUDE_RESET_SERVICES
from github.env import get_required_env_var, write_github_summary
from github.markdown import convert_to_markdown_table
from actions_logging.app_logging import logger

# release app imports
import release_app.config as ra_config
import release_app.constants as ra_constants
from release_app.com_utils import invert_dict_type, get_production_version, get_current_env_vars_version, get_repos
from release_app.models import MsData, EnvDeployStatus
from release_app.promote import deploy_services

def filter_excluded_services(repos, additional_excluded_services = []):
    excluded_services = set(EXCLUDE_RESET_SERVICES)
    excluded_services.update(additional_excluded_services)
    filtered_repos = {}

    for r, data in repos.items():
        if isinstance(data, dict):
            if data['ms_name'] not in excluded_services:
                filtered_repos[r] = data
        elif isinstance(data, list):
            # If the data is a list (multiple services in one repo)
            filtered_list = [ms for ms in data if ms['ms_name'] not in excluded_services]
            if filtered_list:
                filtered_repos[r] = filtered_list

    return filtered_repos

async def main():
    env_name = get_required_env_var("ENV_NAME")
    ignored_services = []
    for s in os.getenv("IGNORED_SERVICES", '').split(','):
        if s:
            ignored_services.append(s.strip())
    short_region = ra_constants.ENVS['staging']['short_region']
    repos = get_repos(repo_name=ra_config.repos_git_repo, file_path=ra_config.repos_path, ref=ra_config.repos_branch)
    filtered_repos = filter_excluded_services(repos, ignored_services)
    invert_repos = invert_dict_type(filtered_repos)
    all_versions = {
        ms_name: {
            'version': version,
            'type': invert_repos[ms_name]['type']
        }
        for ms_name in invert_repos.keys()
        if (version := get_production_version(ms_name)[0])
    }
    current_env_vars_versions_map = {
        ms_name: get_current_env_vars_version(ms_name)
        for ms_name in all_versions.keys()
    }

    logger.info(f"Environment Variables Versions Map: {current_env_vars_versions_map}")

    services_to_deploy = [
        MsData(
            name=ms_name,
            version=str(ms_data['version']),
            env_vars_version=current_env_vars_versions_map.get(ms_name, ""),
            type=ms_data['type']
        )
        for ms_name, ms_data in all_versions.items()
    ]

    logger.info(f"Deploying {len(all_versions)} services with versions: {list(all_versions.keys())}")
    status, details = await deploy_services(services_to_deploy, env_name, short_region, ignore_errors=True)

    logger.info(details)

    write_github_summary(f"# Deployment status: {status.value}")
    write_github_summary(convert_to_markdown_table(details))

if __name__ == "__main__":
    asyncio.run(main())
