"""Background scheduler for daily reminder generation."""

from __future__ import annotations

import logging

from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger

from app.core.config import get_settings
from app.db.session import SessionLocal
from app.services.notification_service import NotificationService
from app.services.reminder_service import ReminderService

logger = logging.getLogger(__name__)
_scheduler: BackgroundScheduler | None = None


def run_daily_reminders() -> None:
    db = SessionLocal()
    try:
        service = ReminderService(db)
        result = service.generate_daily_reminders()
        logger.info("Daily reminders generated: %s", result)
        send_result = service.send_whatsapp_for_today()
        if send_result.get("sent") or send_result.get("fallback"):
            logger.info("WhatsApp reminder dispatch: %s", send_result)
        notify_result = NotificationService(db).generate_daily_notifications()
        if notify_result.get("created"):
            logger.info("In-app notifications generated: %s", notify_result)
    except Exception:
        logger.exception("Daily reminder job failed")
        db.rollback()
    finally:
        db.close()


def start_scheduler() -> BackgroundScheduler:
    global _scheduler
    if _scheduler is not None:
        return _scheduler

    settings = get_settings()
    _scheduler = BackgroundScheduler(timezone=settings.timezone)
    _scheduler.add_job(
        run_daily_reminders,
        CronTrigger(hour=8, minute=0, timezone=settings.timezone),
        id="daily_reminders",
        replace_existing=True,
    )
    _scheduler.start()
    logger.info("Reminder scheduler started (daily 08:00 %s)", settings.timezone)
    return _scheduler


def shutdown_scheduler() -> None:
    global _scheduler
    if _scheduler is not None:
        _scheduler.shutdown(wait=False)
        _scheduler = None
