# -*- coding: utf-8 -*-
import os
import shutil

import yaml

if __name__ == '__main__':

    app_dir = r"apps"
    if not os.path.exists(app_dir):
        print(f'[err] {app_dir} 不存在')
        exit(1)

    appstore_dir = r"appstore"
    if os.path.exists(appstore_dir):
        shutil.rmtree(appstore_dir)
    shutil.copytree(app_dir, appstore_dir)

    dockge_dir = r"dockge"
    if os.path.exists(dockge_dir):
        shutil.rmtree(dockge_dir)

    app_docker_compose_file = []
    for root, dirs, files in os.walk(appstore_dir):
        if 'docker-compose.yml' in files:
            app_docker_compose_file.append(os.path.join(root, 'docker-compose.yml'))

    for docker_compose_file in app_docker_compose_file:
        print(f'[info] Standardized processing: {docker_compose_file} ...')
        parent_dir = os.path.dirname(docker_compose_file)
        version = os.path.basename(os.path.dirname(docker_compose_file))
        app_name = os.path.basename(os.path.dirname(os.path.dirname(docker_compose_file)))
        with open(docker_compose_file, 'r', encoding='utf-8') as f:
            docker_compose = yaml.safe_load(f)
        services = docker_compose.get('services')
        for service_name, service in services.items():
            env_file = service.get('env_file')
            if env_file:
                if isinstance(env_file, list):
                    for i, file in enumerate(env_file):
                        if '${APP_ENV_FILE' in file:
                            env_file[i] = f'./envs/{app_name}.env'
                        elif '${ENV_FILE' in file:
                            env_file[i] = f'.env'
                        elif '${GLOBAL_ENV_FILE' in file:
                            env_file[i] = f'./envs/global.env'
                        else:
                            print('env_file', env_file)
                    docker_compose['services'][service_name]['env_file'] = env_file
            container_name = service.get('container_name')
            if container_name:
                docker_compose['services'][service_name]['container_name'] = container_name.replace('${CONTAINER_NAME}',
                                                                                                    app_name)
        with open(docker_compose_file, 'w', encoding='utf-8') as f:
            yaml.dump(docker_compose, f)
        print(f'[info] Standardized processing: {app_name} {version} {docker_compose_file} Done!')
        data_yml = os.path.join(parent_dir, 'data.yml')
        with open(data_yml, 'r', encoding='utf-8') as f:
            data = yaml.safe_load(f)
        form_fields = data['additionalProperties']['formFields']
        for form_field in form_fields:
            key_name = form_field.get('envKey')
            key_value = form_field.get('default')
            key_desc = form_field.get('labelZh')
            required = form_field.get('required')
            desc = f'# {key_desc}'
            if required:
                desc += ' [必填]'
            env_file = os.path.join(parent_dir, '.env')
            if not os.path.exists(env_file):
                with open(env_file, 'w', encoding='utf-8') as f:
                    f.write(f'{desc} \n')
                    f.write(f'{key_name}={key_value}\n\n')
            else:
                with open(os.path.join(parent_dir, '.env'), 'a', encoding='utf-8') as f:
                    f.write(f'{desc} \n')
                    f.write(f'{key_name}={key_value}\n\n')
        print(f'[info] Standardized processing: {app_name} {version} {data_yml} Done!')

        if os.path.exists(parent_dir):
            dockge_app_dir = os.path.join(dockge_dir, app_name)
            if os.path.exists(dockge_app_dir):
                dockge_version = version.replace('.', '_')
                dockge_app_dir = os.path.join(dockge_dir, f'{app_name}_{dockge_version}')
            shutil.copytree(parent_dir, dockge_app_dir, ignore=shutil.ignore_patterns('data.yml', 'scripts'))
            print(f'[info] Standardized processing: {app_name} {version} {parent_dir} Done!')

    print('Done!')