import os
import json
from typing import List

from aws.s3_apis.s3 import delete_file_from_s3
from solo.constants import LOCK_DIR, LOCK_BUCKET, LOCK_FILE
from github.env import exit_on_error_and_write_summary, write_github_summary
from actions_logging.app_logging import logger
from build_and_deploy.deploy import collect_deployed_services_data, log_short_svc_stats

# release app imports
from app.promote import deploy_services
from app.models import MsData


def get_deploy_data(current_deployed_data: List[dict]) -> List[MsData]:
    deploy_data = []
    logger.info(f"composing payloads for the services deployment")
    try:
        for data in current_deployed_data:
            # if data['latest_version'] == data['version'] and data['env_vars_version'] == data['latest_env_vars_version']:
            #     continue
            svc_deploy_data = {**data, **{"version": data['latest_version'], "env_vars_version": data['latest_env_vars_version']}}
            filtered_data = {key: svc_deploy_data[key] for key in MsData.__annotations__.keys()}
            deploy_data.append(MsData(**filtered_data))
        return deploy_data
    except Exception as e:
        exit_on_error_and_write_summary(f"couldn't build deploy data for services: {e}")


def main():
    env_name = "solo"
    short_region = "us"
    svc_to_ignore = ["radiusapi", "workspace", "jarvis_client", "sdp-controller", "jarvis_client_mr"]
    for s in os.getenv("SVC_TO_IGNORE", '').split(','):
        if s:
            svc_to_ignore.append(s.strip())
    try:
        lock_file_path = os.path.join(LOCK_DIR, LOCK_FILE)
        delete_file_from_s3(bucket_name=LOCK_BUCKET, file_name=lock_file_path, env_name=env_name)
        svc_stats, services_failed_to_get_versions = collect_deployed_services_data(env_name=env_name, svc_to_ignore=svc_to_ignore, ignore_errors=True)
        log_short_svc_stats(svc_stats, env_name)
        if services_failed_to_get_versions:
            logger.warning(f"Failed to get versions for the following services: {services_failed_to_get_versions}")
        services_to_deploy = get_deploy_data(svc_stats)

        deploy_services(services_to_deploy, env_name, short_region, ignore_errors=True)

        post_deploy_stats, post_deploy_services_failed_to_get_versions = collect_deployed_services_data(env_name=env_name, svc_to_ignore=svc_to_ignore, ignore_errors=True)
        logger.info("Post deployment status:")
        log_short_svc_stats(post_deploy_stats, env_name)
        if post_deploy_services_failed_to_get_versions:
            logger.warning(f"Failed to get versions for the following services: {post_deploy_services_failed_to_get_versions}")
            post_deploy_stats += f"\nFailed to get versions for the following services:\n {post_deploy_services_failed_to_get_versions}"
        write_github_summary(post_deploy_stats)
    except Exception as e:
        exit_on_error_and_write_summary(f"failed to release {env_name} env and deploy latest master versions due to error: {e}")

if __name__ == "__main__":
    main()