"""
店铺报表模型
用于存储从淘宝导出的销售明细报表和发货报表数据
"""

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

from app.core.database import Base


class ReportUploadStatus(str, Enum):
    """报表上传状态"""
    PROCESSING = "processing"  # 处理中
    COMPLETED = "completed"    # 已完成
    FAILED = "failed"          # 失败


class ShopSalesReport(Base):
    """销售明细报表表

    用于存储从淘宝导出的销售明细数据
    包含订单状态、退款状态等信息
    """
    __tablename__ = "shop_sales_reports"

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

    # 店铺和批次信息
    shop_name = Column(String(100), nullable=False, comment="店铺名称")
    upload_batch_id = Column(String(36), nullable=False, comment="上传批次ID")

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

    # 商品信息
    商品标题 = Column(String(500), nullable=False, comment="商品标题")
    商品属性 = Column(String(300), comment="商品属性")
    商品价格 = Column(String(50), comment="商品价格")
    购买数量 = Column(Integer, comment="购买数量")

    # 订单状态相关
    订单状态 = Column(String(50), comment="订单状态(买家已付款,等待卖家发货等)")
    退款状态 = Column(String(50), comment="退款状态(没有申请退款/买家已经申请退款等)")
    交易状态 = Column(String(50), comment="交易状态")

    # 备注信息
    商家备注 = Column(Text, comment="商家备注")
    主订单买家留言 = Column(Text, comment="买家留言")
    联系方式备注 = Column(Text, comment="联系方式备注")

    # 时间信息
    订单创建时间 = Column(DateTime, comment="订单创建时间")
    订单付款时间 = Column(DateTime, comment="订单付款时间")
    发货时间 = Column(DateTime, comment="发货时间")

    # 金额信息
    买家应付货款 = Column(String(50), comment="买家应付货款")
    买家实付金额 = Column(String(50), comment="买家实付金额")
    退款金额 = Column(String(50), comment="退款金额")

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

    # 其他字段
    外部系统编号 = Column(String(100), comment="外部系统编号")
    商家编码 = Column(String(100), comment="商家编码")
    支付单号 = Column(String(100), comment="支付单号")

    # 系统字段
    匹配到的采购订单ID = Column(Integer, comment="匹配到的procurement_order.id")
    匹配状态 = Column(String(20), default="待匹配", comment="匹配状态(待匹配/已匹配/匹配失败)")
    匹配备注 = Column(Text, comment="匹配备注")

    created_at = Column(DateTime, server_default=func.now(), comment="创建时间")
    updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now(), comment="更新时间")

    # 索引
    __table_args__ = (
        Index('idx_sales_report_batch', 'upload_batch_id'),
        Index('idx_sales_report_main_order', '主订单编号'),
        Index('idx_sales_report_shop', 'shop_name'),
        Index('idx_sales_report_status', '订单状态'),
    )


class ShopShippingReport(Base):
    """发货报表表 - 加密存储

    用于存储淘宝导出的发货报表数据
    包含收货人信息（加密存储）、物流信息等
    """
    __tablename__ = "shop_shipping_reports"

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

    # 店铺和批次信息
    shop_name = Column(String(100), nullable=False, comment="店铺名称")
    upload_batch_id = Column(String(36), nullable=False, comment="上传批次ID")

    # 订单编号
    订单编号 = Column(String(100), nullable=False, index=True, comment="订单编号(主订单编号)")

    # 收货人信息 - AES加密存储
    收货人姓名_encrypted = Column(Text, comment="收货人姓名(AES加密)")
    收货地址_encrypted = Column(Text, comment="收货地址(AES加密)")
    联系手机_encrypted = Column(Text, comment="联系手机(AES加密)")
    联系电话_encrypted = Column(Text, comment="联系电话(AES加密)")

    # 明文存储的信息
    商家备注 = Column(Text, comment="商家备注(明文)")
    买家留言 = Column(Text, comment="买家留言")
    运送方式 = Column(String(50), comment="运送方式")

    # 物流信息
    物流单号 = Column(String(100), comment="物流单号")
    物流公司 = Column(String(50), comment="物流公司")
    发货时间 = Column(DateTime, comment="发货时间")

    # 订单状态
    订单状态 = Column(String(50), comment="订单状态")
    应发货时间 = Column(DateTime, comment="应发货时间")

    # 金额信息
    买家应付货款 = Column(String(50), comment="买家应付货款")
    买家实付金额 = Column(String(50), comment="买家实付金额")

    # 其他字段
    商品标题 = Column(String(500), comment="商品标题")
    商品属性SKU = Column(String(300), comment="商品属性SKU")
    支付单号 = Column(String(100), comment="支付单号")
    宝贝总数量 = Column(Integer, comment="宝贝总数量")

    # 系统字段
    匹配到的采购订单ID = Column(Integer, comment="匹配到的procurement_order.id")
    last_synced_at = Column(DateTime, comment="最后同步时间")

    created_at = Column(DateTime, server_default=func.now(), comment="创建时间")
    updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now(), comment="更新时间")

    # 索引
    __table_args__ = (
        Index('idx_shipping_report_batch', 'upload_batch_id'),
        Index('idx_shipping_report_order', '订单编号'),
        Index('idx_shipping_report_shop', 'shop_name'),
    )


class ShopReportUpload(Base):
    """报表上传记录表

    用于跟踪每次报表上传的情况
    包含文件名、上传状态、匹配统计等信息
    """
    __tablename__ = "shop_report_uploads"

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

    # 批次信息
    batch_id = Column(String(36), nullable=False, unique=True, index=True, comment="批次ID(UUID)")
    upload_method = Column(String(20), default="web", comment="上传方式(web/directory)")

    # 店铺信息
    shop_names = Column(JSON, comment="店铺名称列表")

    # 文件信息
    sales_report_filenames = Column(JSON, comment="销售明细文件名列表")
    shipping_report_filenames = Column(JSON, comment="发货报表文件名列表")

    # 数据统计
    sales_report_total_rows = Column(Integer, default=0, comment="销售明细总行数")
    shipping_report_total_rows = Column(Integer, default=0, comment="发货报表总行数")
    matched_sub_orders = Column(Integer, default=0, comment="成功匹配的子订单数")
    unmatched_sub_orders = Column(Integer, default=0, comment="未匹配的子订单数")
    duplicate_orders = Column(Integer, default=0, comment="重复订单数")

    # 操作信息
    uploaded_by = Column(String(100), comment="上传操作员")
    upload_status = Column(String(20), default="processing", comment="上传状态(processing/completed/failed)")
    error_message = Column(Text, comment="错误信息")

    # 时间信息
    created_at = Column(DateTime, server_default=func.now(), comment="上传时间")
    completed_at = Column(DateTime, comment="完成时间")

    # 额外信息
    notes = Column(Text, comment="上传备注")

    # 索引
    __table_args__ = (
        Index('idx_report_upload_batch', 'batch_id'),
        Index('idx_report_upload_status', 'upload_status'),
        Index('idx_report_upload_created', 'created_at'),
    )
