#!/usr/bin/env python
"""
测试手动触发导入流程
验证：导入 -> 产品主表生成 -> 采购订单 -> 图片下载
"""

import asyncio
import sys
import time
from pathlib import Path

# 添加项目路径
sys.path.insert(0, str(Path(__file__).parent / "backend"))

from app.core.database import AsyncSessionLocal
from app.workers.scheduler import OrderScheduler
from app.services.import_service import ImportService
from app.services.products_master_service import ProductsMasterService
from app.services.image_download_service import ImageDownloadService
from sqlalchemy import select, func
from app.models.raw_orders import RawOrder
from app.models.products_master import ProductMaster
from app.models.procurement_orders import ProcurementOrder


async def test_complete_flow():
    """测试完整的手动触发流程"""
    
    print("=" * 80)
    print("测试手动触发导入流程")
    print("=" * 80)
    
    # 创建调度器实例
    scheduler = OrderScheduler()
    
    # 初始统计
    async with AsyncSessionLocal() as db:
        initial_raw_count = await db.scalar(select(func.count(RawOrder.id)))
        initial_product_count = await db.scalar(select(func.count(ProductMaster.id)))
        initial_procurement_count = await db.scalar(select(func.count(ProcurementOrder.id)))
        
        print(f"\n初始状态:")
        print(f"  原始订单数: {initial_raw_count}")
        print(f"  产品主表数: {initial_product_count}")
        print(f"  采购订单数: {initial_procurement_count}")
    
    # 执行手动触发
    print(f"\n开始执行手动触发...")
    start_time = time.time()
    
    result = await scheduler.trigger_import_now()
    
    elapsed_time = time.time() - start_time
    
    # 显示结果
    print(f"\n执行结果:")
    print(f"  状态: {result.get('status')}")
    print(f"  处理文件数: {result.get('files_processed', 0)}")
    print(f"  导入记录数: {result.get('total_imported', 0)}")
    print(f"  生成产品数: {result.get('products_generated', 0)}")
    print(f"  创建采购订单数: {result.get('procurement_orders_created', 0)}")
    print(f"  执行时间: {elapsed_time:.2f} 秒")
    
    if result.get('errors'):
        print(f"\n错误信息:")
        for error in result['errors']:
            print(f"  - {error}")
    
    # 最终统计
    async with AsyncSessionLocal() as db:
        final_raw_count = await db.scalar(select(func.count(RawOrder.id)))
        final_product_count = await db.scalar(select(func.count(ProductMaster.id)))
        final_procurement_count = await db.scalar(select(func.count(ProcurementOrder.id)))
        
        # 统计图片下载状态
        pending_images = await db.scalar(
            select(func.count(ProductMaster.id))
            .where(ProductMaster.image_download_status == 'pending')
        )
        completed_images = await db.scalar(
            select(func.count(ProductMaster.id))
            .where(ProductMaster.image_download_status == 'completed')
        )
        
        print(f"\n最终状态:")
        print(f"  原始订单数: {final_raw_count} (+{final_raw_count - initial_raw_count})")
        print(f"  产品主表数: {final_product_count} (+{final_product_count - initial_product_count})")
        print(f"  采购订单数: {final_procurement_count} (+{final_procurement_count - initial_procurement_count})")
        print(f"  待下载图片: {pending_images}")
        print(f"  已下载图片: {completed_images}")
    
    # 等待图片下载（异步进行）
    print(f"\n等待图片后台下载完成（约10秒）...")
    await asyncio.sleep(10)
    
    # 再次检查图片状态
    async with AsyncSessionLocal() as db:
        final_pending = await db.scalar(
            select(func.count(ProductMaster.id))
            .where(ProductMaster.image_download_status == 'pending')
        )
        final_completed = await db.scalar(
            select(func.count(ProductMaster.id))
            .where(ProductMaster.image_download_status == 'completed')
        )
        
        print(f"\n图片下载最终状态:")
        print(f"  待下载: {final_pending}")
        print(f"  已完成: {final_completed}")
    
    print("\n" + "=" * 80)
    print("测试完成!")
    print("=" * 80)


async def test_config_settings():
    """测试配置设置"""
    from app.core.config import settings
    
    print("\n当前配置:")
    print(f"  AUTO_SCHEDULE_ENABLED: {settings.AUTO_SCHEDULE_ENABLED}")
    print(f"  PRODUCTS_GENERATION_DELAY: {settings.PRODUCTS_GENERATION_DELAY} 秒")
    print(f"  IMAGE_DOWNLOAD_BATCH_SIZE: {settings.IMAGE_DOWNLOAD_BATCH_SIZE}")
    print(f"  IMAGE_DOWNLOAD_MAX_CONCURRENT: {settings.IMAGE_DOWNLOAD_MAX_CONCURRENT}")
    print(f"  IMPORT_INTERVAL_MINUTES: {settings.IMPORT_INTERVAL_MINUTES} 分钟")


if __name__ == "__main__":
    print("订单处理系统 - 手动触发测试")
    
    # 测试配置
    asyncio.run(test_config_settings())
    
    # 执行主测试
    asyncio.run(test_complete_flow())