"""
快递单号工具模块
用于自动识别快递公司和检查单号重复
"""
import re
from typing import Optional, Dict, Any
from sqlalchemy import select, or_
from sqlalchemy.ext.asyncio import AsyncSession

from app.models.pending_shipments import PendingShipment
from app.models.shipping_packages import ShippingPackage


# 快递公司识别规则
SHIPPING_PATTERNS = {
    '新元快递': r'^88',  # 以88开头
    '速优快递': r'(?i)^SYW',  # 以SYW开头（不区分大小写）
    '悟空快递': r'(?i)^WK',  # 以WK开头（不区分大小写）
}


def detect_shipping_company(tracking_number: str) -> Optional[str]:
    """
    根据快递单号自动识别快递公司

    Args:
        tracking_number: 快递单号

    Returns:
        识别出的快递公司名称，如果无法识别返回None
    """
    if not tracking_number:
        return None

    tracking_number = tracking_number.strip()

    for company, pattern in SHIPPING_PATTERNS.items():
        if re.match(pattern, tracking_number):
            return company

    return None


async def check_tracking_number_exists(
    db: AsyncSession,
    tracking_number: str
) -> bool:
    """
    检查快递单号是否已存在于系统中

    Args:
        db: 数据库会话
        tracking_number: 快递单号

    Returns:
        如果单号已存在返回True，否则返回False
    """
    if not tracking_number:
        return False

    tracking_number = tracking_number.strip()

    # 检查pending_shipments表中的系统快递单号
    pending_result = await db.execute(
        select(PendingShipment).where(
            PendingShipment.系统快递单号 == tracking_number
        )
    )
    if pending_result.scalar_one_or_none():
        return True

    # 检查shipping_packages表中的快递单号
    package_result = await db.execute(
        select(ShippingPackage).where(
            ShippingPackage.快递单号 == tracking_number
        )
    )
    if package_result.scalar_one_or_none():
        return True

    return False


async def get_existing_order_info(
    db: AsyncSession,
    tracking_number: str
) -> Optional[Dict[str, Any]]:
    """
    获取使用该快递单号的订单信息

    Args:
        db: 数据库会话
        tracking_number: 快递单号

    Returns:
        如果找到使用该单号的订单，返回订单信息字典，否则返回None
    """
    if not tracking_number:
        return None

    tracking_number = tracking_number.strip()

    # 先在pending_shipments表中查找
    pending_result = await db.execute(
        select(PendingShipment).where(
            PendingShipment.系统快递单号 == tracking_number
        )
    )
    pending_order = pending_result.scalar_one_or_none()

    if pending_order:
        return {
            'source': 'pending_shipments',
            'order_no': pending_order.子订单编号,
            'main_order_no': pending_order.主订单编号,
            'shop_name': pending_order.网店名称,
            'product_title': pending_order.商品标题,
            'shipping_time': pending_order.系统发货时间.isoformat() if pending_order.系统发货时间 else None,
            'tracking_number': pending_order.系统快递单号,
            'shipping_company': pending_order.系统快递公司
        }

    # 如果未找到，在shipping_packages表中查找
    package_result = await db.execute(
        select(ShippingPackage).where(
            ShippingPackage.快递单号 == tracking_number
        )
    )
    package = package_result.scalar_one_or_none()

    if package:
        return {
            'source': 'shipping_packages',
            'package_id': package.id,
            'tracking_number': package.快递单号,
            'shipping_company': package.快递公司,
            'created_at': package.created_at.isoformat() if package.created_at else None,
            'status': package.状态
        }

    return None


async def validate_tracking_number(
    db: AsyncSession,
    tracking_number: str
) -> Dict[str, Any]:
    """
    验证快递单号：检查格式、识别公司、检查重复

    Args:
        db: 数据库会话
        tracking_number: 快递单号

    Returns:
        包含验证结果的字典
    """
    if not tracking_number:
        return {
            'valid': False,
            'error': '快递单号不能为空'
        }

    tracking_number = tracking_number.strip()

    # 自动识别快递公司
    detected_company = detect_shipping_company(tracking_number)

    # 检查是否已存在
    exists = await check_tracking_number_exists(db, tracking_number)

    if exists:
        # 获取已存在的订单信息
        existing_order = await get_existing_order_info(db, tracking_number)
        return {
            'valid': False,
            'exists': True,
            'detected_company': detected_company,
            'error': f'快递单号 {tracking_number} 已被使用！请输入新的快递单号',
            'existing_order': existing_order
        }

    return {
        'valid': True,
        'exists': False,
        'detected_company': detected_company,
        'tracking_number': tracking_number
    }