import asyncio
import logging
import os

from .db import SessionLocal
from .repositories import TaskRepository
from .services import current_app_datetime, send_overdue_alerts


logger = logging.getLogger(__name__)


def run_overdue_check() -> None:
    db = SessionLocal()
    try:
        tasks = TaskRepository(db).list_in_progress()
        send_overdue_alerts(db, tasks, current_app_datetime())
    except Exception:
        db.rollback()
        logger.exception("Fallo la revision automatica de actividades retrasadas")
    finally:
        db.close()


async def overdue_reminder_loop() -> None:
    try:
        interval_seconds = max(300, int(os.environ.get("OVERDUE_CHECK_INTERVAL_SECONDS", "3600")))
    except ValueError:
        interval_seconds = 3600
    try:
        notification_hour = int(os.environ.get("OVERDUE_NOTIFICATION_HOUR", "8"))
    except ValueError:
        notification_hour = 8
    notification_hour = min(23, max(0, notification_hour))

    while True:
        now = current_app_datetime()
        if now.hour >= notification_hour:
            await asyncio.to_thread(run_overdue_check)
        await asyncio.sleep(interval_seconds)
