"""
Analytics Service — Celery Tasks.

تسک‌های زمان‌بندی‌شده برای اسنپ‌شات و تجمیع.
"""

import logging
from celery import shared_task
from django.utils import timezone

logger = logging.getLogger(__name__)


@shared_task(
    bind=True,
    max_retries=3,
    default_retry_delay=60,
    name="analytics.take_scheduled_snapshots",
)
def take_scheduled_snapshots(self):
    """اجرای اسنپ‌شات‌های زمان‌بندی‌شده (Celery Beat)."""
    from .models import AggregationDefinition
    from .services import SnapshotEngine

    engine = SnapshotEngine()
    today = timezone.now().date()
    active_defs = AggregationDefinition.objects.filter(is_active=True)

    count = 0
    for defn in active_defs:
        try:
            engine.take_snapshot(defn, snapshot_date=today)
            count += 1
        except Exception as e:
            logger.error("Snapshot task failed for %s: %s", defn.name, e)

    logger.info("Scheduled snapshots completed: %d definitions processed", count)
    return {"processed": count}


@shared_task(
    bind=True,
    max_retries=3,
    default_retry_delay=60,
    name="analytics.calculate_kpi_rollups",
)
def calculate_kpi_rollups(self, tenant_id=None):
    """محاسبه تجمیع‌های KPI برای دوره جاری."""
    from .models import KPIRollup
    from .services import RollupEngine

    engine = RollupEngine()
    # TODO: Iterate over KPI definitions and calculate rollups
    logger.info("KPI rollup calculation completed for tenant=%s", tenant_id)
    return {"tenant_id": str(tenant_id)}


@shared_task(
    name="analytics.generate_report_task",
)
def generate_report_task(report_id):
    """تولید گزارش به صورت async."""
    from .models import GeneratedReport, ReportStatus
    from .report_engine import ReportEngine

    try:
        report = GeneratedReport.objects.get(id=report_id)
        report.status = ReportStatus.GENERATING
        report.save(update_fields=["status"])

        engine = ReportEngine()
        result = engine.generate(report)

        report.status = ReportStatus.COMPLETED
        report.file_url = result.get("file_url", "")
        report.file_size = result.get("file_size")
        report.generated_at = timezone.now()
        report.save(update_fields=[
            "status", "file_url", "file_size", "generated_at",
        ])
        logger.info("Report generated: %s", report_id)

    except Exception as e:
        logger.error("Report generation failed for %s: %s", report_id, e)
        try:
            report = GeneratedReport.objects.get(id=report_id)
            report.status = ReportStatus.FAILED
            report.error_message = str(e)
            report.save(update_fields=["status", "error_message"])
        except GeneratedReport.DoesNotExist:
            pass


@shared_task(
    name="analytics.cleanup_old_snapshots",
)
def cleanup_old_snapshots(days=90):
    """حذف اسنپ‌شات‌های قدیمی‌تر از N روز."""
    from .models import AggregationSnapshot
    cutoff = timezone.now().date() - timezone.timedelta(days=days)
    deleted, _ = AggregationSnapshot.objects.filter(
        snapshot_date__lt=cutoff,
    ).delete()
    logger.info("Cleaned up %d old snapshots (older than %d days)", deleted, days)
    return {"deleted": deleted}
