import logging
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger
from datetime import datetime, timedelta

from src.utils.db import get_db_session
from src.smart_inventory.jobs.cron_model import CronJobLog
from src.smart_inventory.tasks.daily_sales_task import compute_daily_sales

logger = logging.getLogger(__name__)
scheduler = BackgroundScheduler()


def daily_sales_cron():
    """Daily sales computation cron - runs at 1:00 AM to compute yesterday's sales"""
    if scheduler.running:
        return
    
    def job():
        db = get_db_session()
        try:
            # Calculate yesterday's date (the day we want to compute sales for)
            yesterday = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
            
            cron_log = CronJobLog(
                task_type="daily_sales",
                status="started",
                started_at=datetime.utcnow()
            )
            db.add(cron_log)
            db.commit()
            
            # Pass yesterday's date to the task
            task = compute_daily_sales.delay(yesterday)
            cron_log.task_id = task.id
            db.commit()
            
            logger.info(f"Daily sales cron triggered for date: {yesterday}")
            
        except Exception as e:
            logger.error(f"Daily sales cron error: {e}")
        finally:
            db.close()
    
    scheduler.add_job(job, CronTrigger(hour=1, minute=0), id='daily_sales', replace_existing=True)
    scheduler.start()
    logger.info("Daily sales cron started - runs at 1:00 AM to compute yesterday's sales")
