"""
SKU级别订单详情数据模型
用于存储更精确的SKU级别订单状态信息（来自ExportOrderList文件）
"""

from datetime import datetime
from sqlalchemy import (
    Column, Integer, String, Text, DateTime, Float, Boolean,
    Index, UniqueConstraint
)
from sqlalchemy.sql import func

from app.core.database import Base


class OrderSkuDetail(Base):
    """SKU级别订单详情表 - 存储每个子订单的准确状态"""

    __tablename__ = "order_sku_details"

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

    # 订单标识
    sub_order_id = Column(String(100), unique=True, nullable=False, comment="子订单编号")
    main_order_id = Column(String(100), index=True, nullable=False, comment="主订单编号")

    # 商品信息
    product_title = Column(Text, comment="商品标题")
    product_attributes = Column(Text, comment="商品属性（原始格式）")
    normalized_attributes = Column(String(500), index=True, comment="规范化商品属性")
    merchant_code = Column(String(100), comment="商家编码")
    product_id = Column(String(100), comment="商品ID")

    # 数量与金额
    quantity = Column(Integer, comment="购买数量")
    product_price = Column(Float, comment="商品价格")
    buyer_should_pay = Column(Float, comment="买家应付货款")
    buyer_actual_pay = Column(Float, comment="买家实付金额")

    # 状态信息
    order_status = Column(String(100), comment="订单状态")
    refund_status = Column(String(100), comment="退款状态")
    refund_amount = Column(Float, comment="退款金额")

    # 映射后的标准状态（与raw_orders保持一致）
    mapped_order_status = Column(String(50), comment="映射后的订单状态")
    mapped_refund_status = Column(String(50), comment="映射后的退款状态")

    # 时间字段
    order_create_time = Column(DateTime, comment="订单创建时间")
    order_pay_time = Column(DateTime, index=True, comment="订单付款时间")
    ship_time = Column(DateTime, comment="发货时间")

    # 物流信息
    tracking_number = Column(String(100), comment="物流单号")
    logistics_company = Column(String(100), comment="物流公司")

    # 其他信息
    external_system_id = Column(String(100), comment="外部系统编号")
    package_info = Column(Text, comment="套餐信息")
    contact_note = Column(Text, comment="联系方式备注")
    buyer_message = Column(Text, comment="主订单买家留言")
    merchant_note = Column(Text, comment="商家备注")
    note_tags = Column(String(255), comment="备注标签")

    # 支付信息
    payment_id = Column(String(100), comment="支付单号")

    # 赔付信息
    is_active_compensation = Column(Boolean, default=False, comment="是否主动赔付")
    active_compensation_amount = Column(Float, comment="主动赔付金额")
    active_compensation_time = Column(DateTime, comment="主动赔付出账时间")

    # 文件信息
    file_name = Column(String(255), nullable=False, comment="源文件名")
    file_hash = Column(String(64), comment="文件SHA1哈希")

    # 系统字段
    created_at = Column(DateTime, server_default=func.now(), comment="创建时间")
    imported_at = Column(DateTime, server_default=func.now(), comment="导入时间")
    updated_at = Column(DateTime, onupdate=func.now(), comment="更新时间")

    # 索引
    __table_args__ = (
        # 用于与raw_orders匹配的索引
        Index('idx_order_attrs_match', 'main_order_id', 'normalized_attributes'),
        # 用于查询特定订单的所有SKU
        Index('idx_main_order', 'main_order_id'),
        # 用于按支付时间查询
        Index('idx_pay_time', 'order_pay_time'),
        # 用于状态筛选
        Index('idx_status', 'order_status', 'refund_status'),
        {"comment": "SKU级别订单详情表"}
    )
