from __future__ import annotations

import logging
from datetime import datetime, timedelta, timezone

from src.worker.celery_app import celery_app

logger = logging.getLogger(__name__)


@celery_app.task(name="admin.purge_old_scheduler_logs")
def purge_old_scheduler_logs(**kwargs) -> dict:
    """
    Delete scheduler_log rows older than each task's log_retention_days.

    Runs daily at 03:00 UTC via Celery Beat.
    Returns a summary dict with the number of records deleted.
    """
    from sqlalchemy import delete, select
    from src.core.database import SessionLocal
    from src.apps.admin.models.scheduler_config import SchedulerConfig
    from src.apps.admin.models.scheduler_log import SchedulerLog

    total_deleted = 0

    with SessionLocal() as db:
        configs = list(
            db.execute(select(SchedulerConfig)).scalars().all()
        )

        for config in configs:
            retention_days = config.log_retention_days
            if retention_days < 1:
                logger.warning(
                    "Skipping purge for %s: invalid retention_days=%d",
                    config.task_name,
                    retention_days,
                )
                continue
            cutoff = datetime.now(timezone.utc) - timedelta(days=retention_days)
            stmt = (
                delete(SchedulerLog)
                .where(
                    SchedulerLog.task_name == config.task_name,
                    SchedulerLog.created_at < cutoff,
                )
            )
            result = db.execute(stmt)
            count = result.rowcount
            total_deleted += count
            if count:
                logger.info(
                    "Purged %d scheduler_log rows for task '%s' (retention=%d days)",
                    count,
                    config.task_name,
                    retention_days,
                )

        db.commit()

    logger.info("purge_old_scheduler_logs complete — %d rows deleted", total_deleted)
    return {"records_processed": total_deleted}
