#!/usr/bin/env python
"""
批量更新第二批订单的忽略采购状态
"""
import asyncio
import logging
from datetime import datetime
from sqlalchemy import update, select, text
from sqlalchemy.ext.asyncio import AsyncSession

from app.core.database import get_db
from app.models.procurement_orders import ProcurementOrder

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# 第二批需要更新的订单号列表
ORDER_NUMBERS = [
    "2902849608679649768",
    "4636223175381382649",
    "4616882316148554019",
    "2888584105926694950",
    "4710065186578302616",
    "2902432406171450160",
    "2902459333617139453",
    "4709733121581991206",
    "2856378722954208260",
    "4710341520275302616",
    "4710059390639023609",
    "2902345287897467551",
    "4710192841723648338",
    "2902029027111684871",
    "4710059462564458037",
    "4710068966100023609",
    "4710248931934301742",
    "4706798328792030910",
    "2898990084255162358",
    "2902097246585684871"
]

async def update_ignore_purchase_status(db: AsyncSession):
    """
    更新忽略采购状态（待采购订单表和采购清单表）
    """
    try:
        # 统计信息
        procurement_updated = 0
        purchase_list_updated = 0
        not_found = []
        updated_orders = []
        
        for order_number in ORDER_NUMBERS:
            # 1. 更新待采购订单表 (procurement_orders)
            result = await db.execute(
                update(ProcurementOrder)
                .where(ProcurementOrder.原始订单编号 == order_number)
                .values(
                    忽略采购=True,
                    更新时间=datetime.now(),
                    procurement_notes="批量设置忽略采购(第二批) - " + datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                )
            )
            
            if result.rowcount > 0:
                procurement_updated += result.rowcount
                updated_orders.append(order_number)
                logger.info(f"✅ 更新待采购订单 {order_number}: 忽略采购=True")
            else:
                logger.info(f"⏭️ 订单 {order_number} 不在待采购列表中，跳过")
            
            # 2. 尝试更新采购清单表 (purchase_lists) - 使用原生SQL以避免导入错误
            try:
                sql = text("""
                    UPDATE purchase_lists 
                    SET 忽略采购 = 1, 
                        更新时间 = :update_time,
                        备注 = :notes
                    WHERE 原始订单编号 = :order_number
                """)
                
                result2 = await db.execute(
                    sql,
                    {
                        "update_time": datetime.now(),
                        "notes": "批量设置忽略采购(第二批) - " + datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
                        "order_number": order_number
                    }
                )
                
                if result2.rowcount > 0:
                    purchase_list_updated += result2.rowcount
                    logger.info(f"✅ 更新采购清单 {order_number}: 忽略采购=True")
                    
            except Exception as e:
                # 如果表不存在或其他错误，忽略
                logger.debug(f"采购清单表更新跳过: {e}")
            
            # 记录未找到的订单
            if result.rowcount == 0:
                not_found.append(order_number)
        
        # 提交事务
        await db.commit()
        
        # 输出统计结果
        logger.info("=" * 60)
        logger.info("第二批订单批量更新完成！")
        logger.info(f"总订单数: {len(ORDER_NUMBERS)}")
        logger.info(f"待采购订单更新: {procurement_updated} 条")
        logger.info(f"采购清单更新: {purchase_list_updated} 条")
        logger.info(f"不在列表中: {len(not_found)} 条")
        if updated_orders:
            logger.info(f"成功更新的订单: {len(updated_orders)} 条")
        logger.info("=" * 60)
        
        return {
            "batch": 2,
            "total": len(ORDER_NUMBERS),
            "procurement_updated": procurement_updated,
            "purchase_list_updated": purchase_list_updated,
            "not_found": len(not_found),
            "updated_orders": updated_orders,
            "not_found_orders": not_found
        }
        
    except Exception as e:
        logger.error(f"更新失败: {e}")
        await db.rollback()
        raise

async def main():
    """主函数"""
    async for db in get_db():
        try:
            result = await update_ignore_purchase_status(db)
            return result
        finally:
            await db.close()
            break

if __name__ == "__main__":
    result = asyncio.run(main())
    print("\n第二批更新结果:", result)