# Generated manually for the interview project.

import uuid

import django.db.models.deletion
from django.db import migrations, models
from django.db.models import Q


class Migration(migrations.Migration):
    initial = True

    dependencies = []

    operations = [
        migrations.CreateModel(
            name="Job",
            fields=[
                ("id", models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ("type", models.CharField(max_length=120)),
                ("payload", models.JSONField(blank=True, default=dict)),
                (
                    "status",
                    models.CharField(
                        choices=[
                            ("queued", "Queued"),
                            ("running", "Running"),
                            ("succeeded", "Succeeded"),
                            ("failed", "Failed"),
                        ],
                        db_index=True,
                        default="queued",
                        max_length=20,
                    ),
                ),
                ("priority", models.SmallIntegerField(default=50)),
                ("available_at", models.DateTimeField(db_index=True)),
                ("attempts", models.PositiveIntegerField(default=0)),
                ("max_attempts", models.PositiveIntegerField(default=3)),
                ("idempotency_key", models.CharField(blank=True, max_length=255, null=True)),
                ("locked_by", models.CharField(blank=True, max_length=255, null=True)),
                ("locked_until", models.DateTimeField(blank=True, null=True)),
                ("last_error", models.TextField(blank=True, default="")),
                ("result", models.JSONField(blank=True, null=True)),
                ("created_at", models.DateTimeField(auto_now_add=True, db_index=True)),
                ("updated_at", models.DateTimeField(auto_now=True)),
                ("finished_at", models.DateTimeField(blank=True, null=True)),
            ],
            options={"ordering": ("-created_at",)},
        ),
        migrations.CreateModel(
            name="JobEvent",
            fields=[
                ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
                (
                    "type",
                    models.CharField(
                        choices=[
                            ("created", "Created"),
                            ("claimed", "Claimed"),
                            ("progress", "Progress"),
                            ("lease_renewed", "Lease renewed"),
                            ("succeeded", "Succeeded"),
                            ("retry_scheduled", "Retry scheduled"),
                            ("failed", "Failed"),
                            ("timeout_requeued", "Timeout requeued"),
                            ("manual_retry", "Manual retry"),
                        ],
                        db_index=True,
                        max_length=40,
                    ),
                ),
                ("attempt", models.PositiveIntegerField(default=0)),
                ("worker_id", models.CharField(blank=True, max_length=255, null=True)),
                ("message", models.TextField(blank=True, default="")),
                ("data", models.JSONField(blank=True, default=dict)),
                ("created_at", models.DateTimeField(auto_now_add=True, db_index=True)),
                ("job", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="events", to="jobs.job")),
            ],
            options={"ordering": ("id",)},
        ),
        migrations.AddConstraint(
            model_name="job",
            constraint=models.CheckConstraint(
                name="job_status_valid_shape",
                condition=(
                    Q(finished_at__isnull=True, locked_by__isnull=True, locked_until__isnull=True, status="queued")
                    | Q(finished_at__isnull=True, locked_by__isnull=False, locked_until__isnull=False, status="running")
                    | Q(finished_at__isnull=False, locked_by__isnull=True, locked_until__isnull=True, status__in=["succeeded", "failed"])
                ),
            ),
        ),
        migrations.AddConstraint(
            model_name="job",
            constraint=models.CheckConstraint(
                name="job_attempts_valid",
                condition=Q(attempts__gte=0, attempts__lte=models.F("max_attempts"), max_attempts__gte=1),
            ),
        ),
        migrations.AddConstraint(
            model_name="job",
            constraint=models.UniqueConstraint(
                condition=Q(idempotency_key__isnull=False),
                fields=("idempotency_key",),
                name="job_idempotency_key_unique",
            ),
        ),
        migrations.AddIndex(
            model_name="job",
            index=models.Index(
                condition=Q(status="queued"),
                fields=["available_at", "-priority", "created_at", "id"],
                name="job_claim_idx",
            ),
        ),
        migrations.AddIndex(
            model_name="job",
            index=models.Index(condition=Q(status="running"), fields=["locked_until"], name="job_timeout_idx"),
        ),
        migrations.AddIndex(
            model_name="jobevent",
            index=models.Index(fields=["job", "id"], name="job_event_job_id_idx"),
        ),
        migrations.AddIndex(
            model_name="jobevent",
            index=models.Index(fields=["id"], name="job_event_id_idx"),
        ),
    ]
