"""
Celery application factory for ModuleDesk.

Broker: Redis (same Redis instance used for rate limiting).
Backend: Redis (for task result storage).

Beat schedule:
  - reset_free_tier_credits: runs on the 1st of each month at 00:05 UTC
    to zero out ai_credits_used for all free-plan orgs (paid tiers are
    reset via the Stripe invoice.paid webhook instead).

Usage:
  # Start worker
  celery -A supporthub.app.celery_app worker --loglevel=info

  # Start beat scheduler (in a separate process)
  celery -A supporthub.app.celery_app beat --loglevel=info
"""

from __future__ import annotations

import os

from celery import Celery
from celery.schedules import crontab

from .config import config

REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379/0")

celery_app = Celery(
    "moduledesk",
    broker=REDIS_URL,
    backend=REDIS_URL,
    include=[
        "supporthub.app.tasks.sync_tasks",
        "supporthub.app.tasks.ai_tasks",
        "supporthub.app.tasks.billing_tasks",
    ],
)

celery_app.conf.update(
    task_serializer="json",
    result_serializer="json",
    accept_content=["json"],
    timezone="UTC",
    enable_utc=True,
    task_track_started=True,
    worker_prefetch_multiplier=1,       # fair scheduling for long-running tasks
    task_acks_late=True,                # re-queue on worker crash
    beat_schedule={
        "reset-free-tier-credits-monthly": {
            "task": "supporthub.app.tasks.billing_tasks.reset_free_tier_credits",
            "schedule": crontab(minute=5, hour=0, day_of_month=1),
        },
    },
)
