import os
import sys
from typing import List

from common.common import run_command

from actions_logging.app_logging import logger
from github.env import exit_on_error_and_write_summary, get_required_env_var


def add_files_to_zip(zip_name: str, files_array: List[str]):
    files_str = ''
    for file in files_array:
        files_str += f' {file}'
    files_str = files_str.lstrip(' ')
    run_command(f'zip -u {zip_name} {files_str}')


def main():
    try:
        files_to_include_in_zip = []
        if len(sys.argv) > 1:
            files_to_include_in_zip = [x for x in sys.argv[1:]]

        svc_name = get_required_env_var('SVC_NAME')
        build_number = get_required_env_var('BUILD_NUMBER')
        is_downloaded_from_nexus = get_required_env_var('BUILD_ARTIFACT') == 'false'
        zip_name = svc_name + f'_{build_number}.zip'

        if is_downloaded_from_nexus:
            zip_name = svc_name + '.zip'
            logger.info(f'Zip archive {zip_name} is downloaded from nexus.')
            file_type = run_command(f'file -b "{zip_name}"')
            if 'Zip archive data' in file_type:
                logger.info('ZIP file detected.')
            elif 'gzip compressed data' in file_type:
                logger.info('GZIP file detected. Changing to zip for aws lambda.')
                run_command(f'tar zxvf {zip_name}')
                if os.path.isfile(zip_name):
                    logger.info(f'Removing existing ZIP file to allow overriding')
                    os.remove(zip_name)

                run_command(f'ls -la')
                run_command(f'(cd package/dist/ && zip -r - .) >{zip_name}')
                run_command(f'rm -rf ./package')
                logger.info(f'Created a new {zip_name}')
            else:
                logger.info('File is neither a ZIP nor a GZIP file.')
                raise RuntimeError('Failed to define file type (can be only zip or gzip)')
        else:
            logger.info(f'No zip archive, packaging {zip_name} from dist.')
            run_command(f'(cd dist/ && zip -r - .) >{zip_name}')
            logger.info(f'Packaging {zip_name} done.')

        if len(files_to_include_in_zip):
            logger.info(f'Adding {files_to_include_in_zip} files to {zip_name}.')
            add_files_to_zip(zip_name, files_to_include_in_zip)
            logger.info(f'Adding {files_to_include_in_zip} files to {zip_name} done.')
    except Exception as e:
        exit_on_error_and_write_summary(f'Error make_lambda_zip_for_s3.py. Reason: {e}')


if __name__ == '__main__':
    main()
