"""
同步任务模型
用于跟踪数据同步任务的执行状态
"""

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

from app.core.database import Base


class SyncTaskStatus(str, Enum):
    """同步任务状态"""
    PENDING = "pending"      # 待执行
    RUNNING = "running"      # 执行中
    COMPLETED = "completed"  # 已完成
    FAILED = "failed"       # 失败
    CANCELLED = "cancelled" # 已取消


class SyncTask(Base):
    """同步任务表"""
    __tablename__ = "sync_tasks"
    
    # 主键
    id = Column(Integer, primary_key=True, index=True)
    
    # 任务标识
    task_id = Column(String(100), unique=True, nullable=False, index=True, comment="任务唯一标识")
    task_type = Column(String(50), nullable=False, comment="任务类型：full/incremental/products_only/procurement_only")
    
    # 状态信息
    status = Column(String(20), nullable=False, default=SyncTaskStatus.PENDING, comment="任务状态")
    progress = Column(Integer, default=0, comment="进度百分比")
    current_step = Column(String(200), comment="当前步骤描述")
    steps_completed = Column(Integer, default=0, comment="已完成步骤数")
    total_steps = Column(Integer, default=0, comment="总步骤数")
    
    # 详细信息
    details = Column(JSON, comment="任务详细信息（JSON）")
    error_message = Column(Text, comment="错误信息")
    
    # 执行者信息
    created_by = Column(String(100), comment="创建者")
    
    # 时间信息
    created_at = Column(DateTime, server_default=func.now(), comment="创建时间")
    updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now(), comment="更新时间")
    completed_at = Column(DateTime, comment="完成时间")
    
    def to_dict(self):
        """转换为字典"""
        return {
            "id": self.id,
            "task_id": self.task_id,
            "task_type": self.task_type,
            "status": self.status,
            "progress": self.progress,
            "current_step": self.current_step,
            "steps_completed": self.steps_completed,
            "total_steps": self.total_steps,
            "details": self.details,
            "error_message": self.error_message,
            "created_by": self.created_by,
            "created_at": self.created_at.isoformat() if self.created_at else None,
            "updated_at": self.updated_at.isoformat() if self.updated_at else None,
            "completed_at": self.completed_at.isoformat() if self.completed_at else None
        }