#!/usr/bin/env python
"""
发货API测试脚本
"""
import asyncio
from sqlalchemy import select
from app.core.database import AsyncSessionLocal
from app.models.procurement_orders import ProcurementOrder, SystemShippingStatus
from app.models.shipping_packages import ShippingPackage
from app.services.shipping_service import ShippingService


async def test_shipping_functionality():
    """测试发货功能"""
    print("\n" + "="*80)
    print("🧪 发货功能测试")
    print("="*80)

    async with AsyncSessionLocal() as db:
        service = ShippingService()

        # 测试1: 查询待发货订单
        print("\n📋 测试1: 查询待发货订单")
        try:
            pending = await service.find_pending_shipping_orders(db, limit=10)
            print(f"✅ 找到 {pending['total']} 个待发货订单")
            if pending['orders']:
                print(f"   示例订单ID: {[o.id for o in pending['orders'][:3]]}")
        except Exception as e:
            print(f"❌ 失败: {e}")

        # 测试2: 检查数据库表结构
        print("\n🗄️  测试2: 检查数据库表结构")
        try:
            # 检查procurement_orders新字段
            query = select(ProcurementOrder).limit(1)
            result = await db.execute(query)
            order = result.scalar_one_or_none()

            if order:
                print(f"✅ procurement_orders 表字段:")
                print(f"   系统发货状态: {order.系统发货状态}")
                print(f"   快递公司: {order.快递公司}")
                print(f"   快递单号: {order.快递单号}")
                print(f"   发货时间: {order.发货时间}")
                print(f"   发货操作员: {order.发货操作员}")
            else:
                print("⚠️  没有采购订单数据")
        except Exception as e:
            print(f"❌ 失败: {e}")

        # 测试3: 检查shipping_packages表
        print("\n📦 测试3: 检查shipping_packages表")
        try:
            query = select(ShippingPackage)
            result = await db.execute(query)
            packages = result.scalars().all()
            print(f"✅ shipping_packages 表存在，当前有 {len(packages)} 个包裹")
        except Exception as e:
            print(f"❌ 失败: {e}")

        # 测试4: 查找可合并订单(如果有足够的待发货订单)
        if pending['total'] >= 2:
            print("\n🔍 测试4: 测试订单合并匹配")
            try:
                order_ids = [o.id for o in pending['orders'][:5]]
                mergeable = await service.find_mergeable_orders_exact(db, order_ids)
                print(f"✅ 可合并订单组: {mergeable['total_groups']}")
                print(f"   不可合并订单: {mergeable['total_unmergeable']}")

                if mergeable['mergeable_groups']:
                    group = mergeable['mergeable_groups'][0]
                    print(f"   示例合并组包含 {len(group['procurement_orders'])} 个SKU")
            except Exception as e:
                print(f"❌ 失败: {e}")

        # 统计信息
        print("\n📊 统计信息:")
        try:
            total_query = select(ProcurementOrder)
            total_result = await db.execute(total_query)
            total_orders = len(total_result.scalars().all())

            pending_query = select(ProcurementOrder).where(
                ProcurementOrder.系统发货状态 == SystemShippingStatus.PENDING
            )
            pending_result = await db.execute(pending_query)
            pending_count = len(pending_result.scalars().all())

            shipped_query = select(ProcurementOrder).where(
                ProcurementOrder.系统发货状态 == SystemShippingStatus.SHIPPED
            )
            shipped_result = await db.execute(shipped_query)
            shipped_count = len(shipped_result.scalars().all())

            print(f"   总采购订单: {total_orders}")
            print(f"   待发货: {pending_count}")
            print(f"   已发货: {shipped_count}")
        except Exception as e:
            print(f"❌ 统计失败: {e}")

    print("\n" + "="*80)
    print("✨ 测试完成")
    print("="*80)


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