#!/usr/bin/python3

import sys
import os

for root, dirs, _ in os.walk("/usr/lib/python3/dist-packages"):
    for dir_name in dirs:
        if dir_name.startswith("kare"):
            sys.path.append(os.path.join(root, dir_name))

import argparse
from buildenv.buildenv import BuildEnv
from install.install import Install
from manager.manager import *
from run.run import Run
from run.inspect import Inspect
from remove.remove import Remove
from buildenv.importenv import ImportEnv
from run.container_manager import ContainerManager
from install.tryinstall import TryInstall
from common.utils import HostMessage


def check_sudo_privileges():
    """检查是否有sudo权限"""
    if os.geteuid() != 0:
        print("错误: 此命令需要sudo权限")
        sys.exit(1)


def main():
    release_replace = {
        "ubuntu16.04": "u16",
        "ubuntu18.04": "u18",
        "ubuntu20.04": "u20",
        "ubuntu22.04": "u22",
        "ubuntu24.04": "u24",
    }
    parser = argparse.ArgumentParser(description="Kare Command Line Tool")
    subparsers = parser.add_subparsers(dest='command', required=False)
    # run 子命令
    run_parser = subparsers.add_parser('run', help="使用KARE运行软件")
    run_parser.add_argument("--redirect_io", action="store_true", help="将标准输入输出重定向到运行程序内")
    run_parser.add_argument("run_args", nargs=argparse.REMAINDER)

    # inspect 子命令
    inspect_parser = subparsers.add_parser('inspect', help="使用KARE进行Debug")
    inspect_parser.add_argument("inspect_args", nargs=argparse.REMAINDER)

    # import 子命令
    import_parser = subparsers.add_parser('import', help="使用KARE进行Debug")
    import_parser.add_argument("import_args", nargs=argparse.REMAINDER)

    clear_base_apply_parser = subparsers.add_parser('clear_base_apply', help="清除基础环境中的指定软件包",
                                                      usage='%(prog)s [-h] clear_base_env --list CLEAR_LIST [CLEAR_LIST ...]')
    required = clear_base_apply_parser.add_argument_group('required arguments')
    required.add_argument("clear_base_env", help="基础环境名称")
    required.add_argument("--list", dest="clear_list", nargs='+', required=True, help="指定要清除的软件包列表")

    restore_apply_parser = subparsers.add_parser('restore_apply', help="重置容器，恢复到下层状态，此操作会破坏用户之前更改的内容，请谨慎操作",
                                                  usage='%(prog)s [-h] restore_container --list RESTORE_LIST [RESTORE_LIST ...]')
    required = restore_apply_parser.add_argument_group('required arguments')
    required.add_argument("restore_container", help="环境名称")
    required.add_argument("--list", dest="restore_list", nargs='+', required=True, help="指定要恢复的文件列表")
    
    try_install_parser = subparsers.add_parser('try-install',help='仅测试安装的 deb 和环境，不真正安装')
    try_install_parser.add_argument('--env', required=True,help='目标环境，例如 v10sp1')
    try_install_parser.add_argument('deb_file',help='要尝试安装的 deb 文件名')
    # ps 子命令
    # ps_parser = subparsers.add_parser('ps') # , help="列出正在运行的kare实例")
    
    # stop 子命令
    # stop_parser = subparsers.add_parser('stop') # , help="停止运行的kare实例")
    # stop_parser.add_argument("package_name", nargs='?') # , help="要停止的包名")
    
    # cp 子命令 (从宿主机复制到容器或从容器复制到宿主机)
    # cp_parser = subparsers.add_parser('cp') # , help="在宿主机和kare环境之间复制文件")
    # cp_parser.add_argument("src_path") # , help="源文件路径")
    # cp_parser.add_argument("dest_path") # , help="目标文件路径")

    arg_group = parser.add_mutually_exclusive_group()
    arg_group.add_argument("-E", action="store_true", help="列出构建完成的兼容运行环境")
    arg_group.add_argument("-l", action="store_true", help="列出已安装的软件包")
    arg_group.add_argument("-b", dest="build_release", help="构建兼容运行环境")
    arg_group.add_argument("-L", dest="file_list", help="列出软件包的已安装文件")
    arg_group.add_argument("-s", dest="package_size", help="列出软件包大小")
    arg_group.add_argument("-P", dest="purge",nargs='+', help="模糊移除软件包")
    arg_group.add_argument("-S", dest="search", help="列出文件所在软件包及路径")
    arg_group.add_argument("-e", dest="env", help="指定软件包安装环境")
    parser.add_argument("-p", dest="pid", help="指定命令行应用运行的包名及对应进程号")
    parser.add_argument("-i", dest="install", nargs='+',help="安装软件包")
    parser.add_argument("--chroot", dest="chroot", help="指定chroot环境路径")
    parser.add_argument("--subsystem", dest="subsystem", help="指定安装子系统")

    # TODO 跨版本升级接口
    # TODO 工作空间相关接口
    argslist = parser.parse_args()

    if argslist.command == 'try-install':
        try:
            TryInstall(argslist.env, argslist.deb_file)        
        except RuntimeError as e:
            print(e.args[0][-1])
            exit(e.args[0][0])
    if argslist.E:
        try:
            Manager().get_build_envs
        except Exception as e:
            ...

    elif argslist.l:
        try:
            Manager().get_install_packages
        except Exception as e:
            ...

    elif argslist.build_release:
        build_release = release_replace.get(argslist.build_release, argslist.build_release)

        try:
            BuildEnv(build_release, True if argslist.chroot else False)
        except RuntimeError as e:
            print(e.args[0][-1])
            exit(e.args[0][0])

    elif argslist.file_list:
        try:
            Manager().get_packages_list(argslist.file_list)
        except Exception as e:
            ...

    elif argslist.package_size:
        try:
            Manager().get_package_size(argslist.package_size)
        except Exception as e:
            ...

    elif argslist.purge:
        
        try:
            Remove(argslist.purge)
        except RuntimeError as e:
            print(e.args[0][-1])
            exit(e.args[0][0])

    elif argslist.search:
        Manager().search(argslist.search)

    elif argslist.env:
        env = release_replace.get(argslist.env, argslist.env)
        try:
            Install(env, argslist.install, True if argslist.chroot else False, subsystem=argslist.subsystem)
        except RuntimeError as e:
            print(e.args[0][-1])
            exit(e.args[0][0])

    elif argslist.command == 'run':
        try:
            pid_token = argslist.pid
            Run(argslist.run_args[0:], token=pid_token, redirect_io=True if argslist.redirect_io else False)
        except RuntimeError as e:
            print(e.args[0][-1])
            exit(e.args[0][0])
            
    elif argslist.command == 'inspect':
        try:
            Inspect(argslist.inspect_args[0:])
        except RuntimeError as e:
            print(e.args[0][-1])
            exit(e.args[0][0])
    
    elif argslist.command == 'import':
        try:
            ImportEnv(argslist.import_args[0:])
        except RuntimeError as e:
            print(e.args[0][-1])
            exit(e.args[0][0])
    
    elif argslist.command == 'ps':
        check_sudo_privileges()
        try:
            container_manager = ContainerManager()
            container_manager.ps()
        except RuntimeError as e:
            print(e.args[0][-1])
            exit(e.args[0][0])
    
    elif argslist.command == 'stop':
        check_sudo_privileges()
        try:
            # 如果没有提供包名，则显示帮助信息
            if not argslist.package_name:
                # stop_parser.print_help()
                return
                
            container_manager = ContainerManager()
            success = container_manager.stop(argslist.package_name)
            if not success:
                exit(1)
        except RuntimeError as e:
            print(e.args[0][-1])
            exit(e.args[0][0])
    
    elif argslist.command == 'cp':
        check_sudo_privileges()
        try:
            container_manager = ContainerManager()
            success = container_manager.copy_file_bidirectional(argslist.src_path, argslist.dest_path)
            if not success:
                exit(1)
        except Exception as e:
            print(f"cp命令执行出错: {e}")
            exit(1)

    elif argslist.command == 'clear_base_apply':
        check_sudo_privileges()
        try:
            base_env = argslist.clear_base_env
            hm = HostMessage()
            outputs = hm.remove_base_package(base_env, cli_clear_list=argslist.clear_list)
            print("\n".join(outputs))
        except Exception as e:
            print(f"clear_base命令执行出错: {e}")
            exit(1)

    elif argslist.command == 'restore_apply':
        check_sudo_privileges()
        try:
            env = argslist.restore_container
            hm = HostMessage()
            hm.restore_apply(env, cli_restore_list=argslist.restore_list)
            pass
        except Exception as e:
            print(f"restore_apply命令执行出错: {e}")
            exit(1)

    elif argslist.install:
        print("install 需要-e参数指定安装环境")
    else:
        parser.print_help()


if __name__ == "__main__":
    main()
