import uuid

from django.db import models


class PostCommitDelivery(models.Model):
    class Status(models.TextChoices):
        PENDING = "pending", "Pending"
        PUBLISHING = "publishing", "Publishing"
        RETRY = "retry", "Retry"
        PUBLISHED = "published", "Published"
        DEAD_LETTER = "dead_letter", "Dead letter"

    delivery_id = models.UUIDField(default=uuid.uuid4, unique=True, editable=False)
    channel = models.CharField(max_length=32, default="kafka")
    target = models.CharField(max_length=255)
    method = models.CharField(max_length=120)
    socket_id = models.CharField(max_length=190, null=True, blank=True)
    payload = models.JSONField(default=dict)
    correlation_id = models.CharField(max_length=190, null=True, blank=True, db_index=True)
    status = models.CharField(max_length=24, choices=Status.choices, default=Status.PENDING, db_index=True)
    attempts = models.PositiveIntegerField(default=0)
    next_attempt_at = models.DateTimeField(null=True, blank=True, db_index=True)
    claimed_at = models.DateTimeField(null=True, blank=True)
    published_at = models.DateTimeField(null=True, blank=True)
    dead_letter_at = models.DateTimeField(null=True, blank=True, db_index=True)
    last_error = models.TextField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True, db_index=True)

    class Meta:
        db_table = "post_commit_delivery"
        indexes = [
            models.Index(
                fields=["status", "next_attempt_at", "created_at"],
                name="ix_delivery_eligible",
            )
        ]
