#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'tool'))
from check_modules import install_required_modules
install_required_modules({
    "pandas": "pandas",
    "openpyxl": "openpyxl",
    "requests": "requests",
    "tqdm": "tqdm",
    "urllib3": "urllib3"
})

import argparse
import pandas as pd
from build_iso_cfg import build_iso_cfg
from get_iso_list import get_iso_list
from analyse_version import analyse_version
from beautify_output import beautify_output
def main():
    # 1. 创建参数解析器
    parser = argparse.ArgumentParser(description="distroID版本检查工具")

    # 2. 添加参数
    # 添加互斥组，确保两种参数方式不能同时使用
    group = parser.add_mutually_exclusive_group(required=True)
    
    # 添加位置参数，用于直接指定版本
    group.add_argument("version", nargs='?', 
                      help="版本格式例如 (quality3.1, security4.0, security5.0, security6.0, security7.0)")
    
    # 添加可选参数，用于指定自定义目标文件
    group.add_argument("-c", "--custom", help="指定自定义文件路径")
    
    # 添加可选参数，用于指定自定义iso_info_config文件
    parser.add_argument("-i", "--iso_info_config", help="指定自定义iso_info_config文件路径")

    # 添加其他可选参数
    parser.add_argument("-v", "--verbose", action="store_true", help="是否显示详细信息")
    parser.add_argument("-nb", "--no-base", action="store_true", help="不对比基线版本")
    
    # 3. 解析命令行参数
    args = parser.parse_args()
    
    # 4. 处理业务逻辑
    if args.version:
        # 检查是否存在物料
        version_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'cfg', args.version)  
        # version_file 目录存在且不为空
        if not os.path.exists(version_file) or not os.listdir(version_file):
            print(f"错误: 文件 {version_file} 不存在或为空")
            sys.exit(1)
            
        print(f"使用预定义版本: {args.version}")
        # 在这里添加处理预定义版本的逻辑
        args.custom = None
    else:
        print(f"使用自定义文件: {args.custom}")
        args.custom = os.path.abspath(args.custom)
        # 检查自定义文件是否存在
        if not os.path.exists(args.custom):
            print(f"错误: 自定义文件 {args.custom} 不存在")
            sys.exit(1)

    if args.iso_info_config:
        args.iso_info_config = os.path.abspath(args.iso_info_config)
        # 检查自定义文件是否存在
        if not os.path.exists(args.iso_info_config):
            print(f"错误: 自定义文件 {args.iso_info_config} 不存在")
            sys.exit(1)
        else:
            print(f"[详细信息] 使用自定义iso_info_config文件: {args.iso_info_config}")
    else:
        args.iso_info_config = ""

    # 详细模式输出额外信息
    if args.verbose:
        if args.version:
            print(f"[详细信息] 使用预定义版本: {args.version}")
        else:
            print(f"[详细信息] 使用自定义文件: {args.custom}")

    # 1、生成iso_info_cfg以及"质量更新包列表"
    if not args.iso_info_config:
        distro_list_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'distro-id-list.txt')  # 待分析的发行版ID列表
        distro_info = build_iso_cfg(distro_list_file, args.version, args.custom, args.no_base)

        # iso_info_config_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'tmp', 'iso_info_config.csv')
        # # 检查是否存在iso_info_config_file文件且文件大小不为0
        # if not os.path.exists(iso_info_config_file) or os.path.getsize(iso_info_config_file) == 0:
        #     print(f"错误: 文件 {iso_info_config_file} 不存在或为空")
        #     sys.exit(1)

        # 读取iso_info_config_file文件，文件没有表头，第一列是distro_id
        # df = pd.read_csv(iso_info_config_file, header=None)
        # 提取第一列，即distro_id列
        # distro_ids = distro_info.keys()
        # base_distro_id = [distro_info[distro_id]['baseline_id'] for distro_id in distro_ids]
    else:
        distro_info = {}
        with open(args.iso_info_config, 'r') as f:
            for line in f:
                # 跳过空行
                if not line.strip():
                    continue
                # 分割行数据
                parts = line.strip().split(',')
                if len(parts) >= 6:  # 确保有足够的元素
                    distro_id = parts[0]  # 第一个元素作为键
                    # 创建嵌套字典
                    distro_info[distro_id] = {
                        'arch': parts[1],
                        'product_line': parts[2],
                        'year_version': parts[3],
                        'baseline_id': parts[4],
                        'target': parts[5],
                        'child_line': "",
                        'version_name': ""
                    }

    # distroID转为数字
    try:
        distro_info = {int(k): v for k, v in distro_info.items()}
    except ValueError as e:
        print(f":distroID非法，请检查输入 [{e}]")
        exit(1)

    # 提取所有distro_id和baseline_id
    distro_ids = list(distro_info.keys())
    base_distro_id = [distro_info[distro_id]['baseline_id'] for distro_id in distro_ids]
    
    # 2、获取“待分析版本包列表”
    print('------------开始获取“待分析版本包列表”------------')
    get_iso_list(distro_ids, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'tmp', '1_对比所需物料', '待分析版本包列表'))

    if not args.no_base:
        # 3、获取“基线版本包列表”
        print('------------开始获取“基线版本包列表”------------')
        get_iso_list(base_distro_id, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'tmp', '1_对比所需物料', '基线版本包列表'))

    # 4、开始分析”
    output_data = analyse_version(distro_info, args.no_base)

    # 5、美化输出
    beautify_output(output_data, os.path.join(os.path.dirname(os.path.abspath(__file__)), '评估结果.xlsx'))

if __name__ == "__main__":
    main()
