#!/usr/bin/env python3
"""
更新现有待采购订单的采购方式，应用新的SF分类规则
"""

import asyncio
import sys
sys.path.append('.')

from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy import select, update, text
from app.core.config import settings
from app.models.procurement_orders import ProcurementOrder
from app.routers.procurement_router import _determine_procurement_method

async def update_procurement_methods():
    """更新所有待采购订单的采购方式"""
    # 创建数据库连接
    engine = create_async_engine(settings.DATABASE_URL)
    async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
    
    async with async_session() as db:
        print("开始更新待采购订单的采购方式...")
        
        # 查询所有待采购订单
        result = await db.execute(
            select(ProcurementOrder).filter(
                ProcurementOrder.procurement_status == 'PENDING'
            )
        )
        orders = result.scalars().all()
        
        print(f"找到 {len(orders)} 个待采购订单需要更新")
        
        updated_count = 0
        changes_by_method = {}
        
        for order in orders:
            # 计算新的采购方式
            new_method = _determine_procurement_method(
                order.线上宝贝名称 or "",
                order.线上销售属性 or "",
                order.品牌 or ""
            )
            
            # 如果采购方式有变化，则更新
            if order.procurement_method != new_method:
                old_method = order.procurement_method
                order.procurement_method = new_method
                updated_count += 1
                
                # 统计变化
                change_key = f"{old_method} -> {new_method}"
                changes_by_method[change_key] = changes_by_method.get(change_key, 0) + 1
                
                if updated_count <= 10:  # 显示前10个变化的例子
                    print(f"  更新订单 {order.原始订单编号}: {old_method} -> {new_method}")
                    print(f"    商品: {order.线上宝贝名称}")
                    print(f"    属性: {order.线上销售属性}")
        
        # 提交更改
        await db.commit()
        
        print(f"\n更新完成！共更新了 {updated_count} 个订单的采购方式")
        
        if changes_by_method:
            print("\n采购方式变化统计:")
            for change, count in sorted(changes_by_method.items()):
                print(f"  {change}: {count} 个订单")
        
        # 统计最新的采购方式分布
        print("\n更新后采购方式分布:")
        result = await db.execute(
            text("""
                SELECT procurement_method, COUNT(*) as count
                FROM procurement_orders 
                WHERE procurement_status = 'PENDING'
                GROUP BY procurement_method 
                ORDER BY count DESC
            """)
        )
        
        for row in result:
            method, count = row
            print(f"  {method}: {count} 个订单")

if __name__ == "__main__":
    asyncio.run(update_procurement_methods())