"""
原始订单数据模型
"""

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

from app.core.database import Base


class RawOrder(Base):
    """原始订单表 - 完整保留 Excel 数据"""
    
    __tablename__ = "raw_orders"
    
    # 主键
    id = Column(Integer, primary_key=True, index=True)
    
    # 文件信息
    file_name = Column(String(255), nullable=False, comment="源文件名")
    file_hash = Column(String(64), nullable=False, comment="文件SHA1哈希")
    row_idx = Column(Integer, nullable=False, comment="Excel行号")
    
    # 原始订单字段 - 根据实际Excel动态映射
    原始订单编号 = Column(String(100), index=True, comment="原始订单编号")
    网店名称 = Column(String(100), comment="网店名称")
    交易状态 = Column(String(50), comment="交易状态")
    付款时间 = Column(DateTime, index=True, comment="付款时间")
    下载时间 = Column(DateTime, comment="下载时间")
    拍下时间 = Column(DateTime, comment="拍下时间")
    交易完成时间 = Column(DateTime, comment="交易完成时间")
    
    # 买家信息
    买家旺旺号 = Column(String(100), comment="买家旺旺号")
    买家留言 = Column(Text, comment="买家留言")
    
    # 收货信息
    收货人姓名 = Column(String(50), comment="收货人姓名")
    收货人手机号 = Column(String(20), comment="收货人手机号")
    收货人身份证 = Column(String(30), comment="收货人身份证")
    收货地址 = Column(Text, comment="收货地址")
    
    # 商品信息
    线上宝贝名称 = Column(Text, comment="线上宝贝名称")
    线上销售属性 = Column(Text, comment="线上销售属性")
    线上商家编码 = Column(String(100), index=True, comment="线上商家编码")
    商品编号 = Column(String(100), comment="商品编号")
    SKU编号 = Column(String(100), index=True, comment="SKU编号")
    图片 = Column(Text, comment="图片链接")
    
    # 数量与金额
    数量 = Column(Integer, comment="数量")
    订单单价 = Column(Float, comment="订单单价")
    订单金额 = Column(Float, comment="订单金额")
    实付金额 = Column(Float, comment="实付金额")
    商品小计 = Column(Float, comment="单个商品行的金额(数量×单价)")
    是否合并订单 = Column(Boolean, default=False, comment="标识是否为包含多个商品的合并订单")
    
    # 退款信息
    退款状态 = Column(String(50), comment="退款状态")
    退款金额 = Column(Float, comment="退款金额")
    
    # 卖家信息
    卖家备注 = Column(Text, comment="卖家备注")
    卖家留言 = Column(Text, comment="卖家留言")
    
    # 物流信息
    发货时间 = Column(DateTime, comment="发货时间")
    物流公司 = Column(String(100), comment="物流公司")
    物流单号 = Column(String(100), comment="物流单号")
    
    # 其他动态字段（存储未映射的列）
    extra_fields = Column(JSON, comment="其他字段JSON")
    
    # 系统字段
    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__ = (
        Index('idx_file_row', 'file_hash', 'row_idx'),
        Index('idx_order_sku', '原始订单编号', '线上商家编码', 'SKU编号'),
        Index('idx_payment_time', '付款时间'),
        # 订单去重唯一约束：线上宝贝名称 + 线上销售属性 + 数量 + 原始订单编号 + 付款时间
        # 应用层预处理NULL值，避免SQLite NULL!=NULL问题
        UniqueConstraint('线上宝贝名称', '线上销售属性', '数量', '原始订单编号', '付款时间', 
                        name='uk_raw_order_dedup_v4'),
        {"comment": "原始订单数据表"}
    )


class ProcessedFile(Base):
    """已处理文件记录表"""
    
    __tablename__ = "processed_files"
    
    id = Column(Integer, primary_key=True, index=True)
    file_name = Column(String(255), nullable=False, comment="文件名")
    file_path = Column(String(500), comment="文件路径")
    file_hash = Column(String(64), unique=True, nullable=False, comment="文件SHA1哈希")
    file_size = Column(Integer, comment="文件大小（字节）")
    
    # 处理信息
    processed_at = Column(DateTime, server_default=func.now(), comment="处理时间")
    rows_total = Column(Integer, default=0, comment="总行数")
    rows_imported = Column(Integer, default=0, comment="成功导入行数")
    rows_failed = Column(Integer, default=0, comment="失败行数")
    
    # 错误信息
    errors = Column(JSON, comment="错误详情JSON")
    status = Column(String(20), default="success", comment="处理状态")
    
    # 系统字段
    created_at = Column(DateTime, server_default=func.now(), comment="创建时间")
    
    __table_args__ = (
        {"comment": "已处理文件记录表"}
    )