from sqlalchemy import Column, Integer, String, DateTime, Boolean, Text, JSON
from sqlalchemy.sql import func
from src.utils.db import Base


class CronJobLog(Base):
    """Unified model for logging all smart-inventory related cron job executions"""
    __tablename__ = "smart_inventory_cron_job_logs"

    id = Column(Integer, primary_key=True, index=True)
    task_type = Column(String(100), nullable=False, index=True)  # e.g., 'daily_sales', 'service_level'
    task_id = Column(String(255), nullable=True, index=True)  # Celery task ID
    status = Column(String(50), nullable=False, default="started")  # started, success, failed
    
    # Results tracking (flexible for different task types)
    processed_count = Column(Integer, nullable=True, default=0)
    inserted_count = Column(Integer, nullable=True, default=0)
    updated_count = Column(Integer, nullable=True, default=0)
    rows_inserted = Column(Integer, nullable=True, default=0)
    target_date = Column(String(50), nullable=True)  # Date for which computation was done
    
    # Timing
    started_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
    completed_at = Column(DateTime(timezone=True), nullable=True)
    duration_seconds = Column(Integer, nullable=True)  # Duration in seconds
    
    # Logs and errors
    error_message = Column(Text, nullable=True)
    task_result = Column(JSON, nullable=True)  # Store full task result as JSON
    
    # Metadata
    created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
    updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False)

    def __repr__(self):
        return f"<CronJobLog(id={self.id}, task_type={self.task_type}, status={self.status}, started_at={self.started_at})>"
