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

"""
任务实例ID修复脚本
为所有现有的任务实例记录生成并设置instance_id

用法:
    python scripts/fix_instance_ids.py
"""

import os
import sys
import logging
import uuid
from sqlalchemy import text

# 添加项目根目录到系统路径
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

# 导入项目模块
from data.session import get_db
from data.models.task_instance import TaskInstance

# 设置日志
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    handlers=[
        logging.StreamHandler(sys.stdout),  # 输出到控制台
        logging.FileHandler("fix_instance_ids.log")  # 输出到文件
    ]
)
logger = logging.getLogger("fix_instance_ids")

def fix_instance_ids():
    """为所有现有的任务实例记录生成并设置instance_id"""
    try:
        # 获取数据库会话
        db = next(get_db())
        
        # 查询所有没有instance_id的任务实例记录
        instances = db.query(TaskInstance).filter(
            (TaskInstance.instance_id == None) | 
            (TaskInstance.instance_id == '')
        ).all()
        
        logger.info(f"发现 {len(instances)} 条没有instance_id的任务实例记录")
        
        # 为每条记录生成并设置instance_id
        for instance in instances:
            instance_id = str(uuid.uuid4())
            instance.instance_id = instance_id
            logger.info(f"为任务实例 ID={instance.id} 设置instance_id={instance_id}")
        
        # 提交更改
        db.commit()
        logger.info("所有任务实例记录的instance_id已更新")
        
        return True
    except Exception as e:
        logger.error(f"修复任务实例ID失败: {str(e)}")
        if 'db' in locals():
            db.rollback()
        return False

def main():
    """主函数"""
    logger.info("开始修复任务实例ID...")
    
    # 修复任务实例ID
    success = fix_instance_ids()
    
    if success:
        logger.info("任务实例ID修复成功！")
    else:
        logger.error("任务实例ID修复失败！")
    
    # 根据修复结果设置退出码
    sys.exit(0 if success else 1)

if __name__ == "__main__":
    main() 