#!/usr/bin/env python3
"""
测试付款时间范围筛选功能
验证日期边界处理是否正确
"""

import asyncio
import aiohttp
import json
from datetime import datetime, timedelta

async def test_payment_time_range_filter():
    """测试付款时间范围筛选"""
    
    base_url = "http://localhost:8000/api/v1"
    
    async with aiohttp.ClientSession() as session:
        print("=== 测试付款时间范围筛选功能 ===\n")
        
        # 1. 测试今日订单筛选
        print("1. 测试今日订单筛选")
        today = datetime.now()
        today_start = today.replace(hour=0, minute=0, second=0, microsecond=0)
        today_end = today.replace(hour=23, minute=59, second=59, microsecond=999999)
        
        params = {
            'payment_time_from': today_start.strftime('%Y-%m-%dT%H:%M:%S'),
            'payment_time_to': today_end.strftime('%Y-%m-%dT%H:%M:%S'),
            'page': 1,
            'page_size': 100
        }
        
        print(f"   开始时间: {params['payment_time_from']}")
        print(f"   结束时间: {params['payment_time_to']}")
        
        async with session.get(f"{base_url}/procurement/orders", params=params) as resp:
            if resp.status == 200:
                data = await resp.json()
                orders = data.get('orders', [])
                print(f"   找到订单数: {len(orders)}")
                
                # 验证所有订单的付款时间是否在今日范围内
                out_of_range = []
                for order in orders:
                    payment_time_str = order.get('付款时间')
                    if payment_time_str:
                        payment_time = datetime.fromisoformat(payment_time_str.replace('T', ' '))
                        if payment_time.date() != today.date():
                            out_of_range.append({
                                '订单号': order.get('原始订单编号'),
                                '付款时间': payment_time_str
                            })
                
                if out_of_range:
                    print(f"   ❌ 发现 {len(out_of_range)} 个订单不在今日范围内:")
                    for item in out_of_range[:5]:  # 只显示前5个
                        print(f"      订单 {item['订单号']}: {item['付款时间']}")
                else:
                    print(f"   ✅ 所有订单都在今日范围内")
            else:
                print(f"   ❌ 请求失败: {resp.status}")
        
        print()
        
        # 2. 测试昨日订单筛选
        print("2. 测试昨日订单筛选")
        yesterday = today - timedelta(days=1)
        yesterday_start = yesterday.replace(hour=0, minute=0, second=0, microsecond=0)
        yesterday_end = yesterday.replace(hour=23, minute=59, second=59, microsecond=999999)
        
        params = {
            'payment_time_from': yesterday_start.strftime('%Y-%m-%dT%H:%M:%S'),
            'payment_time_to': yesterday_end.strftime('%Y-%m-%dT%H:%M:%S'),
            'page': 1,
            'page_size': 100
        }
        
        print(f"   开始时间: {params['payment_time_from']}")
        print(f"   结束时间: {params['payment_time_to']}")
        
        async with session.get(f"{base_url}/procurement/orders", params=params) as resp:
            if resp.status == 200:
                data = await resp.json()
                orders = data.get('orders', [])
                print(f"   找到订单数: {len(orders)}")
                
                # 验证所有订单的付款时间是否在昨日范围内
                out_of_range = []
                for order in orders:
                    payment_time_str = order.get('付款时间')
                    if payment_time_str:
                        payment_time = datetime.fromisoformat(payment_time_str.replace('T', ' '))
                        if payment_time.date() != yesterday.date():
                            out_of_range.append({
                                '订单号': order.get('原始订单编号'),
                                '付款时间': payment_time_str
                            })
                
                if out_of_range:
                    print(f"   ❌ 发现 {len(out_of_range)} 个订单不在昨日范围内:")
                    for item in out_of_range[:5]:
                        print(f"      订单 {item['订单号']}: {item['付款时间']}")
                else:
                    print(f"   ✅ 所有订单都在昨日范围内")
            else:
                print(f"   ❌ 请求失败: {resp.status}")
        
        print()
        
        # 3. 测试跨日期范围
        print("3. 测试最近3天订单筛选")
        three_days_ago = today - timedelta(days=2)
        three_days_start = three_days_ago.replace(hour=0, minute=0, second=0, microsecond=0)
        today_end = today.replace(hour=23, minute=59, second=59, microsecond=999999)
        
        params = {
            'payment_time_from': three_days_start.strftime('%Y-%m-%dT%H:%M:%S'),
            'payment_time_to': today_end.strftime('%Y-%m-%dT%H:%M:%S'),
            'page': 1,
            'page_size': 100
        }
        
        print(f"   开始时间: {params['payment_time_from']}")
        print(f"   结束时间: {params['payment_time_to']}")
        
        async with session.get(f"{base_url}/procurement/orders", params=params) as resp:
            if resp.status == 200:
                data = await resp.json()
                orders = data.get('orders', [])
                print(f"   找到订单数: {len(orders)}")
                
                # 统计每天的订单数
                date_counts = {}
                for order in orders:
                    payment_time_str = order.get('付款时间')
                    if payment_time_str:
                        payment_time = datetime.fromisoformat(payment_time_str.replace('T', ' '))
                        date_key = payment_time.date()
                        date_counts[date_key] = date_counts.get(date_key, 0) + 1
                
                print("   每日订单分布:")
                for date_key in sorted(date_counts.keys()):
                    print(f"      {date_key}: {date_counts[date_key]} 个订单")
            else:
                print(f"   ❌ 请求失败: {resp.status}")
        
        print()
        
        # 4. 测试边界情况 - 只有开始时间
        print("4. 测试只有开始时间的筛选")
        params = {
            'payment_time_from': today_start.strftime('%Y-%m-%dT%H:%M:%S'),
            'page': 1,
            'page_size': 10
        }
        
        print(f"   开始时间: {params['payment_time_from']}")
        print(f"   结束时间: 未设置")
        
        async with session.get(f"{base_url}/procurement/orders", params=params) as resp:
            if resp.status == 200:
                data = await resp.json()
                orders = data.get('orders', [])
                print(f"   找到订单数: {len(orders)}")
                if orders:
                    # 显示前3个订单的付款时间
                    print("   前3个订单:")
                    for order in orders[:3]:
                        print(f"      {order.get('原始订单编号')}: {order.get('付款时间')}")
            else:
                print(f"   ❌ 请求失败: {resp.status}")
        
        print("\n=== 测试完成 ===")

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