#!/usr/bin/env python3
"""
测试新的采购清单管理功能
基于procurement_orders表的SKU级别采购清单
"""

import asyncio
import logging
from datetime import datetime
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker

from app.core.database import init_db
from app.services.procurement_list_service import ProcurementListService

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)


async def test_procurement_list_service():
    """测试采购清单服务"""
    print("=" * 70)
    print("🧪 测试新的采购清单管理功能")
    print("=" * 70)
    
    try:
        # 初始化数据库
        await init_db()
        logger.info("数据库初始化完成")
        
        # 创建数据库连接
        engine = create_async_engine('sqlite+aiosqlite:///./ordersys.db')
        async_session = async_sessionmaker(engine, expire_on_commit=False)
        
        service = ProcurementListService()
        
        async with async_session() as session:
            print("\n📊 1. 测试获取采购清单统计信息")
            stats = await service.get_procurement_list_stats(session)
            
            print(f"基础统计:")
            basic = stats['basic_stats']
            print(f"  总订单数: {basic['total_orders']}")
            print(f"  唯一SKU: {basic['unique_skus']}")
            print(f"  总数量: {basic['total_quantity']}")
            print(f"  总金额: ¥{basic['total_amount']:,.2f}")
            print(f"  涉及品牌: {basic['total_brands']}")
            print(f"  紧急订单: {basic['urgent_orders']}")
            
            print(f"\n采购方式分布:")
            for method in stats['method_distribution']:
                print(f"  {method['method']}: {method['sku_count']} SKU, {method['order_count']} 订单, ¥{method['total_amount']:,.2f}")
            
            print(f"\nTOP 5品牌:")
            top_brands = stats.get('top_brands', [])
            for i, brand in enumerate(top_brands[:5], 1):
                print(f"  {i}. {brand['brand']}: {brand['sku_count']} SKU, ¥{brand['total_amount']:,.2f}")
            
            print("\n📋 2. 测试获取采购清单（按SKU聚合）")
            procurement_list = await service.get_procurement_list(
                session,
                page=1,
                page_size=10
            )
            
            print(f"采购清单分页信息:")
            pagination = procurement_list['pagination']
            print(f"  总SKU数: {pagination['total']}")
            print(f"  当前页: {pagination['page']}")
            print(f"  页面大小: {pagination['page_size']}")
            print(f"  总页数: {pagination['pages']}")
            
            print(f"\n前5个SKU:")
            for i, item in enumerate(procurement_list['items'][:5], 1):
                print(f"  {i}. {item['线上宝贝名称'][:50]}...")
                print(f"     品牌: {item['品牌'] or 'N/A'}")
                print(f"     采购方式: {item['procurement_method']}")
                print(f"     需求数量: {item['total_quantity']}")
                print(f"     订单数: {item['order_count']}")
                print(f"     平均价格: ¥{item['avg_price']:,.2f}")
                print(f"     建议采购量: {item['suggested_quantity']}")
                print(f"     预估成本: ¥{item['estimated_cost']:,.2f}")
                print()
            
            print("\n🔍 3. 测试获取特定SKU详情")
            if procurement_list['items']:
                test_sku = procurement_list['items'][0]
                sku_key = test_sku['sku_key']
                
                sku_details = await service.get_sku_details(session, sku_key)
                
                if "error" not in sku_details:
                    print(f"SKU: {sku_key}")
                    print(f"商品信息:")
                    product_info = sku_details['product_info']
                    print(f"  商品名称: {product_info['线上宝贝名称']}")
                    print(f"  销售属性: {product_info['线上销售属性'] or 'N/A'}")
                    print(f"  品牌: {product_info['品牌'] or 'N/A'}")
                    print(f"  货号: {product_info['货号'] or 'N/A'}")
                    
                    print(f"聚合统计:")
                    stats = sku_details['aggregated_stats']
                    print(f"  订单数: {stats['total_orders']}")
                    print(f"  总数量: {stats['total_quantity']}")
                    print(f"  总金额: ¥{stats['total_amount']:,.2f}")
                    print(f"  平均价格: ¥{stats['avg_price']:,.2f}")
                    print(f"  紧急订单: {stats['urgent_orders']}")
                    
                    print(f"采购方式分布:")
                    for method, data in sku_details['method_distribution'].items():
                        print(f"  {method}: {data['count']} 订单, {data['quantity']} 数量")
                else:
                    print(f"❌ 获取SKU详情失败: {sku_details['error']}")
            
            print("\n🏷️ 4. 测试按采购方式筛选")
            la_list = await service.get_procurement_list(
                session,
                procurement_method='LA',
                page=1,
                page_size=5
            )
            
            print(f"LA采购方式SKU数: {la_list['pagination']['total']}")
            print(f"前3个LA采购SKU:")
            for i, item in enumerate(la_list['items'][:3], 1):
                print(f"  {i}. {item['线上宝贝名称'][:40]}...")
                print(f"     数量: {item['total_quantity']}, 预估成本: ¥{item['estimated_cost']:,.2f}")
            
            print("\n🎯 5. 测试按品牌筛选")
            top_brands = stats.get('top_brands', [])
            if top_brands:
                top_brand = top_brands[0]['brand']
                brand_list = await service.get_procurement_list(
                    session,
                    brand=top_brand,
                    page=1,
                    page_size=5
                )
                
                print(f"{top_brand} 品牌SKU数: {brand_list['pagination']['total']}")
                print(f"前3个{top_brand}品牌SKU:")
                for i, item in enumerate(brand_list['items'][:3], 1):
                    print(f"  {i}. {item['线上宝贝名称'][:40]}...")
                    print(f"     采购方式: {item['procurement_method']}, 数量: {item['total_quantity']}")
        
        await engine.dispose()
        
        print("\n" + "=" * 70)
        print("✅ 新的采购清单管理功能测试完成!")
        print("=" * 70)
        print("📋 功能特点:")
        print("  ✅ 1. 基于procurement_orders表生成SKU级别采购清单")
        print("  ✅ 2. 支持按采购方式、品牌筛选")
        print("  ✅ 3. 提供详细的统计信息和分析")
        print("  ✅ 4. 自动计算建议采购量和预估成本")
        print("  ✅ 5. 支持SKU级别的详细信息查看")
        print()
        print("📍 API端点:")
        print("  GET /procurement/list - 获取采购清单")
        print("  GET /procurement/list/stats - 获取统计信息")
        print("  GET /procurement/list/sku/{sku_key} - 获取SKU详情")
        print("=" * 70)
        
    except Exception as e:
        logger.error(f"测试失败: {e}")
        print(f"\n❌ 错误: {e}")
        import traceback
        traceback.print_exc()
        raise


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