"""
待发货订单表模型 - 新的独立发货模块
This is part of the new independent shipping module that does not affect existing modules.
"""

from datetime import datetime
from typing import Optional
from sqlalchemy import (
    Column, Integer, String, Text, Numeric, DateTime, Boolean, Float, JSON,
    UniqueConstraint, Index, ForeignKey
)
from sqlalchemy.sql import func
from sqlalchemy.orm import relationship
from app.core.database import Base


class PendingShipment(Base):
    """待发货订单表 - 包含Excel原始30个字段 + 扩展管理字段"""
    __tablename__ = "pending_shipments"

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

    # ========== Excel文件原始字段（30个） ==========
    子订单编号 = Column(String(50), nullable=False)
    主订单编号 = Column(String(50), nullable=False)
    商品标题 = Column(String(500))
    商品价格 = Column(Numeric(12, 2))
    购买数量 = Column(Integer, default=1)
    外部系统编号 = Column(String(100))
    商品属性 = Column(String(200))
    套餐信息 = Column(Text)
    联系方式备注 = Column(Text)
    订单状态 = Column(String(50))
    商家编码 = Column(String(100))
    支付单号 = Column(String(50))
    买家应付货款 = Column(Numeric(12, 2))
    买家实付金额 = Column(Numeric(12, 2))
    退款状态 = Column(String(50))
    退款金额 = Column(String(50))  # 原始数据可能是文本如"无退款申请"
    订单创建时间 = Column(DateTime)
    订单付款时间 = Column(DateTime)
    淘鲜达渠道 = Column(String(10))
    商品ID = Column(String(50))
    分阶段信息 = Column(Text)
    备注标签 = Column(String(100))
    商家备注 = Column(Text)
    主订单买家留言 = Column(Text)
    发货时间 = Column(DateTime)  # Excel中的原始发货时间
    物流单号 = Column(String(100))  # Excel中的原始物流单号
    物流公司 = Column(String(50))  # Excel中的原始物流公司
    是否主动赔付 = Column(String(10))
    主动赔付金额 = Column(Numeric(12, 2))
    主动赔付出账时间 = Column(DateTime)

    # ========== 仓库备注字段 ==========
    warehouse_notes = Column(Text, comment='仓库备注-记录商品问题(颜色/尺码/产品缺陷等)')
    warehouse_notes_updated_at = Column(DateTime, comment='仓库备注更新时间')

    # ========== 新增必需字段 ==========
    网店名称 = Column(String(100), nullable=False)  # 小晴天7/uslife/晴七公主/信泽供货商
    procurement_order_id = Column(Integer, nullable=True)  # 关联procurement_orders.id（只读，不修改原表）
    address_encoding = Column(String(64))  # SHA-256收件信息编码

    # ========== 系统发货管理字段 ==========
    系统发货状态 = Column(String(20), default='PENDING')  # PENDING/SHIPPED/CANCELLED
    系统发货时间 = Column(DateTime)
    系统快递单号 = Column(String(100))
    系统快递公司 = Column(String(50))

    # ========== 分次发货追踪字段 ==========
    已发货数量 = Column(Integer, default=0, comment='已发货件数')
    发货状态详情 = Column(String(20), default='PENDING', comment='发货状态详情: PENDING/PARTIAL/SHIPPED')
    商品扫码记录 = Column(JSON)  # 存储扫码信息 {"scanned_at": "2024-01-01", "codes": ["123", "456"]}
    发货操作员 = Column(String(50))
    取消发货时间 = Column(DateTime)
    取消发货操作员 = Column(String(50))
    取消发货原因 = Column(Text)

    # ========== 显示状态管理字段 ==========
    manual_display_status = Column(String(20))  # 手动设置的显示状态: active/hidden
    is_manually_set = Column(Boolean, default=False)  # 状态是否被手动设置过

    # ========== 数据管理字段 ==========
    数据更新时间 = Column(DateTime)  # 最后一次该店铺上传时间
    upload_batch_id = Column(String(36))  # 关联上传批次UUID（每次上传更新）
    first_upload_batch_id = Column(String(36), comment='订单首次创建时的批次ID，永不更新')
    match_status = Column(String(20), default='pending')  # pending/matched/failed
    match_confidence = Column(Float, default=1.0)  # 匹配置信度
    is_deleted = Column(Boolean, default=False)  # 软删除标记（标记为无需发货）
    deleted_reason = Column(String(100))  # 删除原因（如：不在最新清单中）

    # ========== 关系 ==========
    shipment_records = relationship(
        "ShipmentRecord",
        back_populates="pending_shipment",
        cascade="all, delete-orphan",
        lazy="dynamic"
    )

    # ========== 审计字段 ==========
    created_at = Column(DateTime, server_default=func.now())
    updated_at = Column(DateTime, onupdate=func.now())

    # ========== 表约束和索引 ==========
    __table_args__ = (
        UniqueConstraint('子订单编号', '网店名称', name='uk_sub_order_shop'),
        Index('idx_pending_main_order', '主订单编号'),
        Index('idx_pending_sub_order', '子订单编号'),
        Index('idx_pending_shop', '网店名称'),
        Index('idx_pending_address_encoding', 'address_encoding'),
        Index('idx_pending_procurement', 'procurement_order_id'),
        Index('idx_pending_status', '系统发货状态'),
        Index('idx_pending_batch', 'upload_batch_id'),
        Index('idx_pending_first_batch', 'first_upload_batch_id'),
    )

    def __repr__(self):
        return f"<PendingShipment(id={self.id}, 子订单编号={self.子订单编号}, 网店名称={self.网店名称})>"

    def to_dict(self):
        """Convert to dictionary for API responses"""
        return {
            'id': self.id,
            # Excel原始字段
            '子订单编号': self.子订单编号,
            '主订单编号': self.主订单编号,
            '商品标题': self.商品标题,
            '商品价格': float(self.商品价格) if self.商品价格 else None,
            '购买数量': self.购买数量,
            '外部系统编号': self.外部系统编号,
            '商品属性': self.商品属性,
            '套餐信息': self.套餐信息,
            '联系方式备注': self.联系方式备注,
            '订单状态': self.订单状态,
            '商家编码': self.商家编码,
            '支付单号': self.支付单号,
            '买家应付货款': float(self.买家应付货款) if self.买家应付货款 else None,
            '买家实付金额': float(self.买家实付金额) if self.买家实付金额 else None,
            '退款状态': self.退款状态,
            '退款金额': self.退款金额,
            '订单创建时间': self.订单创建时间.isoformat() if self.订单创建时间 else None,
            '订单付款时间': self.订单付款时间.isoformat() if self.订单付款时间 else None,
            '淘鲜达渠道': self.淘鲜达渠道,
            '商品ID': self.商品ID,
            '分阶段信息': self.分阶段信息,
            '备注标签': self.备注标签,
            '商家备注': self.商家备注,
            '主订单买家留言': self.主订单买家留言,
            '发货时间': self.发货时间.isoformat() if self.发货时间 else None,  # Excel原始
            '物流单号': self.物流单号,  # Excel原始
            '物流公司': self.物流公司,  # Excel原始
            '是否主动赔付': self.是否主动赔付,
            '主动赔付金额': float(self.主动赔付金额) if self.主动赔付金额 else None,
            '主动赔付出账时间': self.主动赔付出账时间.isoformat() if self.主动赔付出账时间 else None,
            # 仓库备注
            'warehouse_notes': self.warehouse_notes,
            'warehouse_notes_updated_at': self.warehouse_notes_updated_at.strftime('%Y-%m-%d %H:%M:%S') if self.warehouse_notes_updated_at else None,
            # 新增必需字段
            '网店名称': self.网店名称,
            'procurement_order_id': self.procurement_order_id,
            'address_encoding': self.address_encoding,
            # 系统发货管理字段
            '系统发货状态': self.系统发货状态,
            '系统发货时间': self.系统发货时间.isoformat() if self.系统发货时间 else None,
            '系统快递单号': self.系统快递单号,
            '系统快递公司': self.系统快递公司,
            # 分次发货追踪字段
            '已发货数量': self.已发货数量 or 0,
            '发货状态详情': self.发货状态详情 or 'PENDING',
            '商品扫码记录': self.商品扫码记录,
            '发货操作员': self.发货操作员,
            '取消发货时间': self.取消发货时间.isoformat() if self.取消发货时间 else None,
            '取消发货操作员': self.取消发货操作员,
            '取消发货原因': self.取消发货原因,
            # 显示状态管理字段
            'manual_display_status': self.manual_display_status,
            'is_manually_set': self.is_manually_set,
            # 数据管理字段
            '数据更新时间': self.数据更新时间.isoformat() if self.数据更新时间 else None,
            'upload_batch_id': self.upload_batch_id,
            'first_upload_batch_id': self.first_upload_batch_id,
            'match_status': self.match_status,
            'match_confidence': self.match_confidence,
            'is_deleted': self.is_deleted,
            'deleted_reason': self.deleted_reason,
            # 审计字段
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None,
        }

    @property
    def is_ready_for_shipping(self):
        """判断订单是否可以发货"""
        return (
            self.系统发货状态 == 'PENDING' and
            not self.is_deleted and
            self.订单状态 == '买家已付款,等待卖家发货'
        )

    @property
    def has_refund(self):
        """判断订单是否有退款"""
        return self.退款状态 and self.退款状态 != '没有申请退款'