from celery import shared_task
from sqlalchemy.orm import Session
from app.db.session import SessionLocal
from app.db.models import DLQ, Delivery
from app.workers.deliveries import deliver_message


@shared_task(bind=True, name="app.workers.dlq.replay_dlq")
def replay_dlq(self) -> str:
    """
    Periodic task to replay failed messages from DLQ
    
    Strategy:
    - Pick oldest 10 DLQ entries
    - Recreate Delivery records
    - Enqueue deliver_message tasks
    - Delete from DLQ on success
    
    Runs every 5 minutes (configured in celery beat schedule)
    """
    db: Session = SessionLocal()
    
    try:
        dlq_entries = (
            db.query(DLQ)
            .order_by(DLQ.created_at.asc())
            .limit(10)
            .all()
        )
        
        replayed = 0
        for entry in dlq_entries:
            # Create new delivery
            delivery = Delivery(
                notification_id=entry.notification_id,
                channel=entry.channel,
                target=entry.payload.get("target", ""),
                status="pending",
                attempts=0
            )
            db.add(delivery)
            db.flush()
            
            # Enqueue
            deliver_message.delay(delivery.id)
            
            # Remove from DLQ
            db.delete(entry)
            replayed += 1
        
        db.commit()
        return f"dlq:replayed:{replayed}"
    
    finally:
        db.close()
