import uuid

from django.db import models


class ClinicalRotationDelivery(models.Model):
    class Method(models.TextChoices):
        PREVIEW = "clinical_rotation_preview", "Preview"
        SCHEDULE = "clinical_rotation_schedule", "Schedule"
        RELEASE = "clinical_rotation_release", "Release"
        FINALIZE = "clinical_rotation_finalize", "Finalize"
        SCHEDULE_RECONCILE = (
            "clinical_rotation_schedule_reconcile",
            "Schedule reconcile",
        )

    class Status(models.TextChoices):
        PENDING = "pending", "Pending"
        PUBLISHING = "publishing", "Publishing"
        PUBLISHED = "published", "Published"
        RETRY = "retry", "Retry"
        SCHEDULE_RECONCILE_REQUIRED = (
            "schedule_reconcile_required",
            "Schedule reconcile required",
        )
        FAILED = "failed", "Failed"
        TERMINAL = "terminal", "Terminal receipt"

    delivery_id = models.UUIDField(default=uuid.uuid4, unique=True, editable=False)
    plan = models.ForeignKey(
        "api.ClinicalRotationPlan", on_delete=models.PROTECT, related_name="deliveries"
    )
    handoff = models.ForeignKey(
        "api.ClinicalRotationLeaseHandoff",
        on_delete=models.PROTECT,
        related_name="deliveries",
        null=True,
        blank=True,
    )
    plan_revision = models.PositiveIntegerField()
    method = models.CharField(max_length=64, choices=Method.choices)
    correlation_id = models.CharField(max_length=190)
    request_digest = models.CharField(max_length=71)
    status = models.CharField(
        max_length=40, choices=Status.choices, default=Status.PENDING, db_index=True
    )
    socket_id = models.CharField(max_length=190, null=True, blank=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)
    last_error_code = models.CharField(max_length=120, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True, db_index=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "clinical_rotation_delivery"
        constraints = [
            models.UniqueConstraint(
                fields=["plan", "plan_revision", "method"],
                name="uq_cr_delivery_plan_method",
            )
        ]
        indexes = [
            models.Index(
                fields=["status", "next_attempt_at", "created_at"],
                name="ix_cr_delivery_eligible",
            )
        ]
