"""
Service for managing site settings in the database
"""
import logging
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from fastapi import HTTPException, status

from app.models.site_settings import SiteSettings
from app.schemas.site_settings import SiteSettingsUpdate, SiteSettingsResponse
from app.services.scheduler_service import SchedulerService

logger = logging.getLogger(__name__)


class SiteSettingsService:
    """Service for CRUD operations on site settings"""
    
    @staticmethod
    async def get_or_create_settings(db: AsyncSession) -> SiteSettings:
        """
        Get site settings (id=1).
        If it doesn't exist, create it with defaults.
        """
        result = await db.execute(select(SiteSettings).where(SiteSettings.id == 1))
        settings = result.scalars().first()
        
        if not settings:
            logger.info("[SiteSettings] Creating default site settings")
            settings = SiteSettings(id=1)
            db.add(settings)
            await db.commit()
            await db.refresh(settings)
        
        return settings
    
    @staticmethod
    async def get_settings(db: AsyncSession) -> SiteSettingsResponse:
        """Get current site settings"""
        settings = await SiteSettingsService.get_or_create_settings(db)
        return SiteSettingsResponse.model_validate(settings)
    
    @staticmethod
    async def update_settings(
        db: AsyncSession,
        update_data: SiteSettingsUpdate
    ) -> SiteSettingsResponse:
        """
        Update site settings and apply scheduler changes.
        Automatically updates scraping schedule if settings changed.
        """
        try:
            # Get or create settings
            settings = await SiteSettingsService.get_or_create_settings(db)
            
            # Update fields
            for field, value in update_data.model_dump(exclude_unset=True).items():
                if hasattr(settings, field):
                    setattr(settings, field, value)
            
            db.add(settings)
            await db.commit()
            await db.refresh(settings)
            
            logger.info("[SiteSettings] Settings updated successfully")
            logger.info(f"[SiteSettings] Scraping Enabled: {settings.scraping_enabled}")
            logger.info(f"[SiteSettings] Frequency: {settings.scraping_frequency} at {settings.scraping_time} {settings.client_timezone}")
            
            # Update scheduler with new settings
            await SchedulerService.update_settings(db, settings)
            
            return SiteSettingsResponse.model_validate(settings)
        
        except Exception as e:
            logger.error(f"❌ [SiteSettings] Error updating settings: {str(e)}", exc_info=True)
            await db.rollback()
            raise HTTPException(
                status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
                detail=f"Failed to update settings: {str(e)}"
            )
    
    @staticmethod
    async def enable_scraping(db: AsyncSession) -> SiteSettingsResponse:
        """Enable scraping with current settings"""
        settings = await SiteSettingsService.get_or_create_settings(db)
        
        if settings.scraping_enabled:
            logger.info("[SiteSettings] Scraping already enabled")
            return SiteSettingsResponse.model_validate(settings)
        
        settings.scraping_enabled = True
        db.add(settings)
        await db.commit()
        await db.refresh(settings)
        
        logger.info("[SiteSettings] ✅ Scraping enabled")
        await SchedulerService.update_settings(db, settings)
        
        return SiteSettingsResponse.model_validate(settings)
    
    @staticmethod
    async def disable_scraping(db: AsyncSession) -> SiteSettingsResponse:
        """Disable scheduled scraping"""
        settings = await SiteSettingsService.get_or_create_settings(db)
        
        if not settings.scraping_enabled:
            logger.info("[SiteSettings] Scraping already disabled")
            return SiteSettingsResponse.model_validate(settings)
        
        settings.scraping_enabled = False
        db.add(settings)
        await db.commit()
        await db.refresh(settings)
        
        logger.info("[SiteSettings] ✅ Scraping disabled")
        await SchedulerService.stop_scraping_job()
        
        return SiteSettingsResponse.model_validate(settings)
