#!/usr/bin/env python
"""
修复网店名称字段的Unicode转义字符问题
"""
import asyncio
import logging
import json
from sqlalchemy import select, update
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.database import get_db
from app.models.products_master import ProductMaster

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


async def fix_shop_names(db: AsyncSession):
    """修复网店名称字段的Unicode转义字符"""
    
    # 1. 查找所有产品
    logger.info("查找所有产品...")
    query = select(ProductMaster)
    result = await db.execute(query)
    all_products = result.scalars().all()
    
    logger.info(f"找到 {len(all_products)} 个产品")
    
    fixed_count = 0
    failed_count = 0
    
    for product in all_products:
        try:
            if not product.网店名称:
                continue
                
            # 检查是否需要修复
            shop_names = product.网店名称
            
            # 如果是字符串，尝试解析为JSON
            if isinstance(shop_names, str):
                try:
                    # 尝试解析JSON字符串
                    parsed_names = json.loads(shop_names)
                    
                    # 如果成功解析，直接设置为列表（SQLAlchemy会自动处理）
                    product.网店名称 = parsed_names
                    fixed_count += 1
                    logger.info(f"修复产品 {product.id}: {product.线上宝贝名称[:30]}...")
                    logger.info(f"  原值: {shop_names}")
                    logger.info(f"  新值: {parsed_names}")
                    
                except json.JSONDecodeError:
                    # 如果不是有效的JSON，可能是单个店铺名称
                    # 转换为列表
                    product.网店名称 = [shop_names]
                    fixed_count += 1
                    logger.info(f"转换单个店铺名称: {shop_names} -> [{shop_names}]")
            
            # 每修复100个产品提交一次
            if fixed_count > 0 and fixed_count % 100 == 0:
                await db.commit()
                logger.info(f"已修复 {fixed_count} 个产品...")
                
        except Exception as e:
            logger.error(f"修复产品 {product.id} 失败: {e}")
            failed_count += 1
            continue
    
    # 最终提交
    await db.commit()
    
    logger.info(f"修复完成！成功: {fixed_count}, 失败: {failed_count}")
    
    # 验证修复结果
    verify_query = select(ProductMaster).limit(10)
    verify_result = await db.execute(verify_query)
    samples = verify_result.scalars().all()
    
    logger.info("验证修复结果（前10个产品）:")
    for sample in samples:
        logger.info(f"  {sample.线上宝贝名称[:30]}: {sample.网店名称}")
    
    return {
        'fixed': fixed_count,
        'failed': failed_count,
        'total': len(all_products)
    }


async def main():
    """主函数"""
    async for db in get_db():
        try:
            result = await fix_shop_names(db)
            print(f"\n修复结果:")
            print(f"  总产品数: {result['total']}")
            print(f"  成功修复: {result['fixed']}")
            print(f"  修复失败: {result['failed']}")
        finally:
            await db.close()
        break


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