from datetime import datetime
from sqlalchemy import Boolean, DateTime, String, Integer, func
from sqlalchemy.orm import Mapped, mapped_column

from app.db.base import Base


class SiteSettings(Base):
    """
    Global site configuration for scraping scheduling.
    Only one record should exist in this table (id=1).
    """
    __tablename__ = "site_settings"

    id: Mapped[int] = mapped_column(Integer, primary_key=True, default=1)
    
    # Scraping Scheduling Configuration
    scraping_enabled: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False)
    """Enable/disable automated scraping"""
    
    scraping_frequency: Mapped[str] = mapped_column(
        String(50), 
        nullable=False, 
        default="daily"
    )
    """Scraping frequency: 'daily', 'weekly', or custom cron expression"""
    
    scraping_time: Mapped[str | None] = mapped_column(
        String(5),  # Format: HH:MM (24-hour)
        nullable=True,
        default="02:00"
    )
    """Time to run scheduled scraping in client's timezone. Format: HH:MM. Optional when frequency='custom'"""
    
    client_timezone: Mapped[str] = mapped_column(
        String(50),
        nullable=False,
        default="UTC"
    )
    """Client timezone (e.g., 'Europe/Madrid', 'America/New_York', 'UTC'). Used for scheduling."""
    
    scraping_day_of_week: Mapped[str] = mapped_column(
        String(50),
        nullable=True,
        default="monday"
    )
    """For weekly scraping: day of week (monday-sunday)"""
    
    scraping_custom_cron: Mapped[str | None] = mapped_column(
        String(255),
        nullable=True
    )
    """Custom cron expression for advanced scheduling. Used when frequency='custom' """
    
    enable_discovery: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True)
    """Enable SERP API discovery during scheduled scraping"""
    
    headless_mode: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True)
    """Run browser in headless mode during scheduled scraping"""
    
    timeout_seconds: Mapped[int] = mapped_column(Integer, nullable=False, default=15)
    """Timeout in seconds for page load during scheduled scraping"""
    
    # Logging
    last_scheduled_run: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
    """Timestamp of last scheduled scraping execution"""
    
    last_scheduled_run_status: Mapped[str | None] = mapped_column(
        String(50),
        nullable=True
    )
    """Status of last run: 'success', 'failed', 'in_progress'"""
    
    last_scheduled_run_summary: Mapped[str | None] = mapped_column(
        String(500),
        nullable=True
    )
    """Summary of last scheduled run (e.g., products scraped, violations found)"""
    
    created_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True), 
        nullable=False, 
        server_default=func.now()
    )
    
    updated_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True),
        nullable=False,
        server_default=func.now(),
        onupdate=func.now(),
    )
