#!/usr/bin/env python3
"""
验证分页修复是否成功
测试稳定的排序和分页逻辑
"""
import asyncio
import sys
from pathlib import Path

# 添加后端目录到路径
backend_dir = Path(__file__).parent / 'backend'
sys.path.insert(0, str(backend_dir))

from app.core.database import get_db
from app.models.procurement_orders import ProcurementOrder
from sqlalchemy import select, desc

async def verify_pagination_fix():
    """验证分页修复"""

    async for db in get_db():
        try:
            print("\n" + "="*70)
            print("🔍 票据核对页面分页修复验证")
            print("="*70)

            # 测试参数
            page_size = 50

            print("\n📊 测试场景：按付款时间降序排列，分页获取数据")
            print(f"   页面大小: {page_size}")

            # 获取第1页
            print(f"\n📄 第1页 (offset=0, limit={page_size}):")
            query1 = (select(ProcurementOrder)
                     .order_by(desc(ProcurementOrder.付款时间), ProcurementOrder.id)
                     .limit(page_size)
                     .offset(0))
            result1 = await db.execute(query1)
            orders1 = result1.scalars().all()
            ids1 = [o.id for o in orders1]
            print(f"   订单数: {len(ids1)}")
            print(f"   ID范围: {ids1[0]} ~ {ids1[-1]}")
            print(f"   首条ID: {ids1[0]}, 末条ID: {ids1[-1]}")

            # 获取第2页
            print(f"\n📄 第2页 (offset={page_size}, limit={page_size}):")
            query2 = (select(ProcurementOrder)
                     .order_by(desc(ProcurementOrder.付款时间), ProcurementOrder.id)
                     .limit(page_size)
                     .offset(page_size))
            result2 = await db.execute(query2)
            orders2 = result2.scalars().all()
            ids2 = [o.id for o in orders2]
            print(f"   订单数: {len(ids2)}")
            print(f"   ID范围: {ids2[0]} ~ {ids2[-1]}")
            print(f"   首条ID: {ids2[0]}, 末条ID: {ids2[-1]}")

            # 获取第3页
            print(f"\n📄 第3页 (offset={page_size*2}, limit={page_size}):")
            query3 = (select(ProcurementOrder)
                     .order_by(desc(ProcurementOrder.付款时间), ProcurementOrder.id)
                     .limit(page_size)
                     .offset(page_size*2))
            result3 = await db.execute(query3)
            orders3 = result3.scalars().all()
            ids3 = [o.id for o in orders3]
            print(f"   订单数: {len(ids3)}")
            print(f"   ID范围: {ids3[0]} ~ {ids3[-1]}")
            print(f"   首条ID: {ids3[0]}, 末条ID: {ids3[-1]}")

            # 验证结果
            print("\n" + "="*70)
            print("✅ 验证结果:")
            print("="*70)

            # 检查是否有重复
            all_ids = ids1 + ids2 + ids3
            unique_ids = set(all_ids)

            if len(all_ids) == len(unique_ids):
                print("✅ PASS: 三个页面没有重复数据")
            else:
                duplicate_count = len(all_ids) - len(unique_ids)
                print(f"❌ FAIL: 发现 {duplicate_count} 条重复数据")
                return False

            # 检查是否有间隙
            if ids1[-1] + 1 == ids2[0] and ids2[-1] + 1 == ids3[0]:
                print("✅ PASS: 页面之间连续，没有间隙")
            else:
                print(f"❌ FAIL: 页面之间有间隙或重叠")
                print(f"   第1页末尾: {ids1[-1]}, 第2页开始: {ids2[0]}")
                print(f"   第2页末尾: {ids2[-1]}, 第3页开始: {ids3[0]}")
                return False

            # 检查排序稳定性
            print("\n📋 排序稳定性测试（重复查询第1页）:")
            query1_again = (select(ProcurementOrder)
                           .order_by(desc(ProcurementOrder.付款时间), ProcurementOrder.id)
                           .limit(page_size)
                           .offset(0))
            result1_again = await db.execute(query1_again)
            orders1_again = result1_again.scalars().all()
            ids1_again = [o.id for o in orders1_again]

            if ids1 == ids1_again:
                print("✅ PASS: 同样的查询返回相同的结果（排序稳定）")
            else:
                print("❌ FAIL: 同样的查询返回不同的结果（排序不稳定）")
                return False

            print("\n" + "="*70)
            print("🎉 所有验证通过！分页修复成功")
            print("="*70)
            return True

        finally:
            await db.close()
            break

if __name__ == '__main__':
    success = asyncio.run(verify_pagination_fix())
    sys.exit(0 if success else 1)
