import argparse
import json
from utils import download_files, get_config_global, add_nexus_arguments, get_nexus_base_url, \
    validate_manifest_dependencies
from actions_logging.app_logging import logger
from github.env import exit_on_error_and_write_summary, get_required_env_var
import os


def validate_manifest():
    if "name" not in manifest_data:
        exit_on_error_and_write_summary("Missing name in manifest.json")
    if "version" not in manifest_data:
        exit_on_error_and_write_summary("Missing version in manifest.json")
    if "dependencies" not in manifest_data:
        exit_on_error_and_write_summary("Missing dependencies in manifest.json")

    validate_manifest_dependencies(manifest_data["dependencies"])


if __name__ == "__main__":
    # Parse command-line arguments
    parser = argparse.ArgumentParser(description="Get input parameters")
    add_nexus_arguments(parser)
    parser.add_argument('--manifest_file', type=str, help='Firefly manifest file path', required=True)
    parser.add_argument('--config_file', type=str, help='Firefly config file path', default='')
    parser.add_argument('--download_directory', type=str, help='Destination directory path', default='')

    args = parser.parse_args()

    if not args.config_file and not args.download_directory:
        exit_on_error_and_write_summary("Either config_file or download_directory is required")

    username = get_required_env_var("NEXUS_USERNAME")
    password = get_required_env_var("NEXUS_PASSWORD")

    with open(args.manifest_file, "r") as manifest_file:
        manifest_data = json.load(manifest_file)

    libsDirectoryPath = args.download_directory

    if args.config_file:
        config_global = get_config_global(args.config_file)

        if "libsDirectoryPath" not in config_global:
            exit_on_error_and_write_summary(f"libsDirectoryPath not found in Global section of config.json")

        libsDirectoryPath = config_global["libsDirectoryPath"]

    logger.info(f"libsDirectoryPath: {libsDirectoryPath}")

    validate_manifest()
    base_url = get_nexus_base_url(args)

    for dependency in manifest_data["dependencies"]:
        logger.info(f"dependency: {dependency}")
        version = manifest_data["dependencies"][dependency]["version"]
        logger.info(f"version: {version}")
        dependency_url = f"{base_url}/{dependency}/{version}"

        download_files(username, password, manifest_data["dependencies"][dependency]["platforms"], dependency_url,
                       libsDirectoryPath, False)

    logger.info_green(f"Files downloaded to {libsDirectoryPath}:")
    for root, dirs, files in os.walk(libsDirectoryPath):
        for file in files:
            logger.info_green(os.path.join(root, file))
