import argparse
from datetime import datetime
from system_management.scheduler.task_scheduler import TaskScheduler
from system_management.scheduler.task_scheduler import TaskManager  
from config import Config  
from utils.logger import CrossPlatformLog

# 初始化日志
log = CrossPlatformLog.get_logger("TaskManagement")


def main():
    # 初始化配置和组件
    scheduler = TaskScheduler(Config.MYSQL_CONFIG)
    manager = TaskManager(scheduler)

    # 解析命令行参数
    parser = argparse.ArgumentParser(description="任务管理工具")
    subparsers = parser.add_subparsers(dest="command", help="可用命令")

    # 列出任务
    list_parser = subparsers.add_parser("list", help="列出所有任务")
    list_parser.add_argument("--active-only", action="store_true", help="只显示活跃任务")

    # 查看任务详情
    show_parser = subparsers.add_parser("show", help="显示任务详情")
    show_parser.add_argument("task_id", type=int, help="任务ID")

    # 更新任务
    update_parser = subparsers.add_parser("update", help="更新任务属性")
    update_parser.add_argument("task_id", type=int, help="任务ID")
    update_parser.add_argument("--name", help="任务名称")
    update_parser.add_argument("--type", help="任务类型")
    update_parser.add_argument("--module", help="模块路径")
    update_parser.add_argument("--cron", help="Cron表达式")
    update_parser.add_argument("--timezone", help="时区")

    # 启用/禁用任务
    toggle_parser = subparsers.add_parser("toggle", help="启用/禁用任务")
    toggle_parser.add_argument("task_id", type=int, help="任务ID")
    toggle_parser.add_argument("--activate", action="store_true", help="启用任务")
    toggle_parser.add_argument("--deactivate", action="store_true", help="禁用任务")

    # 删除任务
    delete_parser = subparsers.add_parser("delete", help="删除任务")
    delete_parser.add_argument("task_id", type=int, help="任务ID")

    # 手动执行任务
    run_parser = subparsers.add_parser("run", help="手动执行任务")
    run_parser.add_argument("task_id", type=int, help="任务ID")

    # 添加任务
    add_parser = subparsers.add_parser("add", help="添加新任务")
    add_parser.add_argument("--name", required=True, help="任务名称")
    add_parser.add_argument("--type", required=True, help="任务类型")
    add_parser.add_argument("--module", required=True, help="模块路径")
    add_parser.add_argument("--cron", required=True, help="Cron表达式")
    add_parser.add_argument("--timezone", default="Asia/Shanghai", help="时区")

    args = parser.parse_args()

    # 执行相应命令
    if args.command == "list":
        try:
            tasks = manager.get_all_tasks(args.active_only)
            manager.print_task_table(tasks)
            log.info(f"列出任务完成，共{len(tasks)}个任务")
        except Exception as e:
            log.error(f"列出任务失败: {str(e)}", exc_info=True)

    elif args.command == "show":
        try:
            task = manager.get_task_by_id(args.task_id)
            if task:
                print("\n===== 任务详情 =====")
                for key, value in task.items():
                    print(f"{key}: {value}")
                print("====================")
                log.info(f"显示任务详情成功，任务ID: {args.task_id}")
            else:
                log.warning(f"未找到任务ID: {args.task_id}")
                print(f"任务ID {args.task_id} 不存在")
        except Exception as e:
            log.error(f"显示任务详情失败，任务ID: {args.task_id}", exc_info=True)

    elif args.command == "update":
        try:
            updates = {}
            if args.name:
                updates['task_name'] = args.name
            if args.type:
                updates['task_type'] = args.type
            if args.module:
                updates['module_path'] = args.module
            if args.cron:
                updates['cron_expression'] = args.cron
            if args.timezone:
                updates['time_zone'] = args.timezone

            if not updates:
                log.warning("未提供任何更新字段")
                print("请至少指定一个更新字段")
                return

            if manager.update_task(args.task_id, updates):
                log.info(f"任务ID {args.task_id} 更新成功")
                print(f"任务ID {args.task_id} 更新成功")
            else:
                log.warning(f"任务ID {args.task_id} 更新失败")
                print(f"任务ID {args.task_id} 更新失败")
        except Exception as e:
            log.error(f"更新任务失败，任务ID: {args.task_id}", exc_info=True)

    elif args.command == "toggle":
        try:
            if args.activate and args.deactivate:
                log.warning("不能同时指定 --activate 和 --deactivate")
                print("不能同时指定 --activate 和 --deactivate")
                return
            if not args.activate and not args.deactivate:
                log.warning("请指定 --activate 或 --deactivate")
                print("请指定 --activate 或 --deactivate")
                return

            if args.activate:
                success = manager.toggle_task_status(args.task_id, True)
                action = "启用"
            else:
                success = manager.toggle_task_status(args.task_id, False)
                action = "禁用"

            if success:
                log.info(f"任务ID {args.task_id} {action}成功")
                print(f"任务ID {args.task_id} {action}成功")
            else:
                log.warning(f"任务ID {args.task_id} {action}失败")
                print(f"任务ID {args.task_id} {action}失败")
        except Exception as e:
            log.error(f"切换任务状态失败，任务ID: {args.task_id}", exc_info=True)

    elif args.command == "delete":
        try:
            confirm = input(f"确定要删除任务ID {args.task_id} 吗? (y/n) ")
            if confirm.lower() == 'y':
                if manager.delete_task(args.task_id):
                    log.info(f"任务ID {args.task_id} 删除成功")
                    print(f"任务ID {args.task_id} 删除成功")
                else:
                    log.warning(f"任务ID {args.task_id} 删除失败")
                    print(f"任务ID {args.task_id} 删除失败")
            else:
                log.info(f"用户取消删除任务ID {args.task_id}")
                print("操作已取消")
        except Exception as e:
            log.error(f"删除任务失败，任务ID: {args.task_id}", exc_info=True)

    elif args.command == "run":
        try:
            log.info(f"开始手动执行任务ID {args.task_id}")
            print(f"正在手动执行任务ID {args.task_id}...")
            if manager.run_task_manually(args.task_id):
                log.info(f"任务ID {args.task_id} 执行成功")
                print(f"任务ID {args.task_id} 执行成功")
            else:
                log.warning(f"任务ID {args.task_id} 执行失败")
                print(f"任务ID {args.task_id} 执行失败")
        except Exception as e:
            log.error(f"手动执行任务失败，任务ID: {args.task_id}", exc_info=True)

    elif args.command == "add":
        try:
            task_id = scheduler.add_task(
                task_name=args.name,
                task_type=args.type,
                module_path=args.module,
                cron_expression=args.cron,
                time_zone=args.timezone
            )
            log.info(f"新任务添加成功，ID: {task_id}")
            print(f"新任务添加成功，ID: {task_id}")
        except Exception as e:
            log.error(f"添加任务失败: {str(e)}", exc_info=True)
            print(f"添加任务失败: {str(e)}")

    else:
        parser.print_help()


if __name__ == "__main__":
    main()