from src.worker.celery_app import celery_app


@celery_app.task(
    bind=True,
    max_retries=5,
    default_retry_delay=60,
    autoretry_for=(Exception,),
    retry_backoff=True,
    retry_backoff_max=7200,
    retry_jitter=True,
)
def retry_webhook_delivery(
    self,
    endpoint_id: int,
    event_type: str,
    event_id: str,
    merchant_id: int,
    data: dict,
) -> None:
    """Celery task for retrying failed webhook deliveries with exponential backoff."""
    from src.core.database import SessionCelery
    from src.apps.developer.models.merchant_webhook_endpoint import MerchantWebhookEndpoint
    from src.apps.developer.helpers.webhook import dispatch_webhook
    import asyncio

    with SessionCelery() as db:
        endpoint = db.get(MerchantWebhookEndpoint, endpoint_id)
        if not endpoint or not endpoint.is_active:
            return  # Endpoint revoked while queued — abort
        asyncio.run(
            dispatch_webhook(db, endpoint, event_type, event_id, merchant_id, data, is_retry=True)
        )
