from django.db import models


class ClinicalRotationLeaseHandoff(models.Model):
    class LeaseState(models.TextChoices):
        ACTIVE = "active", "Active"
        RELEASE_PENDING = "release_pending", "Release pending"
        RELEASED = "released", "Released"
        FINALIZE_PENDING = "finalize_pending", "Finalize pending"
        FINALIZED = "finalized", "Finalized"

    class ApplyState(models.TextChoices):
        APPLY_PENDING = "apply_pending", "Apply pending"
        APPLIED_SYNC_PENDING = "applied_sync_pending", "Applied, sync pending"
        FAILED = "failed", "Failed"

    plan = models.OneToOneField(
        "api.ClinicalRotationPlan", on_delete=models.PROTECT, related_name="lease_handoff"
    )
    plan_revision = models.PositiveIntegerField()
    reservation_id = models.CharField(max_length=190, unique=True)
    encrypted_lease_credential = models.TextField()
    backend_key_version = models.CharField(max_length=64)
    engine_key_version = models.CharField(max_length=64)
    credential_digest = models.CharField(max_length=71)
    canonical_members = models.JSONField(default=list)
    lease_soft_expires_at = models.DateTimeField()
    lease_soft_expires_at_text = models.CharField(max_length=64)
    lease_state = models.CharField(
        max_length=32, choices=LeaseState.choices, default=LeaseState.ACTIVE
    )
    apply_state = models.CharField(
        max_length=32, choices=ApplyState.choices, default=ApplyState.APPLY_PENDING
    )
    sync_state = models.CharField(max_length=32, default="pending")
    sync_receipt_digest = models.CharField(max_length=71, null=True, blank=True)
    response_digest = models.CharField(max_length=71)
    response_status = models.CharField(max_length=32, default="claimed")
    release_delivery_id = models.UUIDField(null=True, blank=True)
    release_state = models.CharField(max_length=32, null=True, blank=True)
    finalize_delivery_id = models.UUIDField(null=True, blank=True)
    finalize_state = models.CharField(max_length=32, null=True, blank=True)
    retry_count = models.PositiveIntegerField(default=0)
    next_retry_at = models.DateTimeField(null=True, blank=True, db_index=True)
    last_error_code = models.CharField(max_length=120, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "clinical_rotation_lease_handoff"
        constraints = [
            models.UniqueConstraint(
                fields=["plan", "plan_revision"], name="uq_cr_handoff_plan_revision"
            )
        ]
