"""
快递包裹管理表模型
用于管理合并发货的快递包裹信息
"""

from sqlalchemy import Column, Integer, String, DateTime, JSON, Text, Index
from sqlalchemy.sql import func
from enum import Enum

from app.core.database import Base


class PackageStatus(str, Enum):
    """包裹状态枚举"""
    PENDING = "PENDING"        # 待发货
    PROCESSING = "PROCESSING"  # 处理中
    SHIPPED = "SHIPPED"        # 已发货
    CANCELLED = "CANCELLED"    # 已取消


class ShippingPackage(Base):
    """快递包裹表 - 管理合并发货场景"""
    __tablename__ = "shipping_packages"

    # 主键
    id = Column(Integer, primary_key=True, index=True)

    # 快递信息
    快递公司 = Column(String(50), nullable=False, comment="快递公司")
    快递单号 = Column(String(100), unique=True, nullable=False, comment="快递单号（唯一）")

    # 收货信息（来自采购订单）
    收货人姓名 = Column(String(100), nullable=False, comment="收货人姓名")
    收货人手机号 = Column(String(20), nullable=False, comment="收货人手机号")
    收货地址 = Column(Text, nullable=False, comment="收货地址")
    买家账号 = Column(String(100), comment="买家账号")

    # 包裹统计信息
    total_skus = Column(Integer, default=0, comment="包含的SKU总数")
    merged_order_numbers = Column(JSON, comment="合并的原始订单编号列表 JSON数组")
    merged_procurement_ids = Column(JSON, comment="合并的采购订单ID列表 JSON数组")

    # 包裹状态
    package_status = Column(String(20), default=PackageStatus.PENDING, comment="包裹状态")

    # 操作信息
    created_by = Column(String(50), comment="创建人（操作员）")
    created_at = Column(DateTime, server_default=func.now(), comment="创建时间")
    shipped_at = Column(DateTime, comment="发货时间")
    updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now(), comment="更新时间")

    # 备注信息
    shipping_notes = Column(Text, comment="发货备注")

    # 取消相关
    cancelled_at = Column(DateTime, comment="取消时间")
    cancelled_by = Column(String(50), comment="取消人")
    cancel_reason = Column(Text, comment="取消原因")


# 创建索引
Index('idx_shipping_packages_tracking', ShippingPackage.快递单号)
Index('idx_shipping_packages_status', ShippingPackage.package_status)
Index('idx_shipping_packages_phone', ShippingPackage.收货人手机号)
Index('idx_shipping_packages_created', ShippingPackage.created_at)
Index('idx_shipping_packages_buyer', ShippingPackage.买家账号)
