# Generated by Django 5.2.6 on 2026-06-12 10:58

import django.db.models.deletion
import uuid
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ("contenttypes", "0002_remove_content_type_name"),
        ("organizations", "0002_workspace_template_user_context_pref"),
        ("tenants", "0001_initial"),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name="SLAPolicy",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                (
                    "is_deleted",
                    models.BooleanField(db_index=True, default=False, verbose_name="deleted"),
                ),
                (
                    "deleted_at",
                    models.DateTimeField(blank=True, null=True, verbose_name="deleted at"),
                ),
                (
                    "created_at",
                    models.DateTimeField(
                        auto_now_add=True, db_index=True, verbose_name="created at"
                    ),
                ),
                ("updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at")),
                (
                    "public_id",
                    models.UUIDField(
                        db_index=True,
                        default=uuid.uuid4,
                        editable=False,
                        unique=True,
                        verbose_name="public id",
                    ),
                ),
                ("name", models.CharField(max_length=300, verbose_name="name")),
                (
                    "description",
                    models.TextField(blank=True, default="", verbose_name="description"),
                ),
                (
                    "sla_type",
                    models.CharField(
                        choices=[
                            ("response", "Response SLA"),
                            ("resolution", "Resolution SLA"),
                            ("approval", "Approval SLA"),
                            ("assignment", "Assignment SLA"),
                        ],
                        db_index=True,
                        max_length=16,
                        verbose_name="SLA type",
                    ),
                ),
                (
                    "target_hours",
                    models.DecimalField(
                        decimal_places=2,
                        help_text="Maximum hours allowed before breach.",
                        max_digits=6,
                        verbose_name="target hours",
                    ),
                ),
                (
                    "warning_hours",
                    models.DecimalField(
                        blank=True,
                        decimal_places=2,
                        help_text="Hours before breach to trigger a warning.",
                        max_digits=6,
                        null=True,
                        verbose_name="warning hours",
                    ),
                ),
                (
                    "business_hours_only",
                    models.BooleanField(
                        default=True,
                        help_text="Count only business hours for the SLA timer.",
                        verbose_name="business hours only",
                    ),
                ),
                (
                    "conditions",
                    models.JSONField(
                        blank=True,
                        default=dict,
                        help_text="JSON conditions for matching this policy to specific entities.",
                        verbose_name="conditions",
                    ),
                ),
                (
                    "priority",
                    models.CharField(
                        blank=True,
                        choices=[
                            ("low", "Low"),
                            ("medium", "Medium"),
                            ("high", "High"),
                            ("urgent", "Urgent"),
                        ],
                        db_index=True,
                        help_text="If set, this SLA only applies to entities with this priority.",
                        max_length=10,
                        verbose_name="priority",
                    ),
                ),
                (
                    "is_active",
                    models.BooleanField(db_index=True, default=True, verbose_name="active"),
                ),
                (
                    "content_type",
                    models.ForeignKey(
                        blank=True,
                        help_text="If set, this SLA policy only applies to this entity type.",
                        null=True,
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="sla_policies",
                        to="contenttypes.contenttype",
                        verbose_name="entity type",
                    ),
                ),
                (
                    "deleted_by",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="+",
                        to=settings.AUTH_USER_MODEL,
                        verbose_name="deleted by",
                    ),
                ),
                (
                    "organization_node",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.PROTECT,
                        related_name="+",
                        to="organizations.organizationnode",
                        verbose_name="organization node",
                    ),
                ),
                (
                    "tenant",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="+",
                        to="tenants.tenant",
                        verbose_name="tenant",
                    ),
                ),
            ],
            options={
                "verbose_name": "SLA policy",
                "verbose_name_plural": "SLA policies",
                "ordering": ("tenant", "name"),
                "abstract": False,
            },
        ),
        migrations.CreateModel(
            name="SLATimer",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                (
                    "created_at",
                    models.DateTimeField(
                        auto_now_add=True, db_index=True, verbose_name="created at"
                    ),
                ),
                ("updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at")),
                (
                    "public_id",
                    models.UUIDField(
                        db_index=True,
                        default=uuid.uuid4,
                        editable=False,
                        unique=True,
                        verbose_name="public id",
                    ),
                ),
                ("object_id", models.PositiveIntegerField(verbose_name="entity id")),
                (
                    "started_at",
                    models.DateTimeField(blank=True, null=True, verbose_name="started at"),
                ),
                (
                    "paused_at",
                    models.DateTimeField(blank=True, null=True, verbose_name="paused at"),
                ),
                (
                    "accumulated_seconds",
                    models.PositiveBigIntegerField(
                        default=0,
                        help_text="Total elapsed seconds excluding pause periods.",
                        verbose_name="accumulated seconds",
                    ),
                ),
                (
                    "target_at",
                    models.DateTimeField(
                        blank=True,
                        help_text="When the SLA target is due.",
                        null=True,
                        verbose_name="target at",
                    ),
                ),
                (
                    "warning_at",
                    models.DateTimeField(
                        blank=True,
                        help_text="When a warning should be triggered.",
                        null=True,
                        verbose_name="warning at",
                    ),
                ),
                (
                    "warning_sent",
                    models.BooleanField(db_index=True, default=False, verbose_name="warning sent"),
                ),
                (
                    "is_breached",
                    models.BooleanField(db_index=True, default=False, verbose_name="breached"),
                ),
                (
                    "breached_at",
                    models.DateTimeField(blank=True, null=True, verbose_name="breached at"),
                ),
                ("is_recovered", models.BooleanField(default=False, verbose_name="recovered")),
                (
                    "recovered_at",
                    models.DateTimeField(blank=True, null=True, verbose_name="recovered at"),
                ),
                (
                    "is_stopped",
                    models.BooleanField(db_index=True, default=False, verbose_name="stopped"),
                ),
                (
                    "stopped_at",
                    models.DateTimeField(blank=True, null=True, verbose_name="stopped at"),
                ),
                (
                    "content_type",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        to="contenttypes.contenttype",
                        verbose_name="entity type",
                    ),
                ),
                (
                    "policy",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.PROTECT,
                        related_name="timers",
                        to="sla_engine.slapolicy",
                        verbose_name="SLA policy",
                    ),
                ),
                (
                    "tenant",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="sla_timers",
                        to="tenants.tenant",
                        verbose_name="tenant",
                    ),
                ),
            ],
            options={
                "verbose_name": "SLA timer",
                "verbose_name_plural": "SLA timers",
                "ordering": ("-created_at",),
            },
        ),
        migrations.CreateModel(
            name="SLABreach",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                (
                    "created_at",
                    models.DateTimeField(
                        auto_now_add=True, db_index=True, verbose_name="created at"
                    ),
                ),
                ("updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at")),
                (
                    "public_id",
                    models.UUIDField(
                        db_index=True,
                        default=uuid.uuid4,
                        editable=False,
                        unique=True,
                        verbose_name="public id",
                    ),
                ),
                ("object_id", models.PositiveIntegerField(null=True, verbose_name="entity id")),
                (
                    "status",
                    models.CharField(
                        choices=[
                            ("warning", "Warning"),
                            ("breached", "Breached"),
                            ("recovered", "Recovered"),
                        ],
                        db_index=True,
                        max_length=16,
                        verbose_name="status",
                    ),
                ),
                (
                    "occurred_at",
                    models.DateTimeField(db_index=True, default=None, verbose_name="occurred at"),
                ),
                ("notes", models.TextField(blank=True, default="", verbose_name="notes")),
                (
                    "content_type",
                    models.ForeignKey(
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        to="contenttypes.contenttype",
                        verbose_name="entity type",
                    ),
                ),
                (
                    "tenant",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="sla_breaches",
                        to="tenants.tenant",
                        verbose_name="tenant",
                    ),
                ),
                (
                    "policy",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.PROTECT,
                        related_name="breaches",
                        to="sla_engine.slapolicy",
                        verbose_name="SLA policy",
                    ),
                ),
                (
                    "timer",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="breaches",
                        to="sla_engine.slatimer",
                        verbose_name="SLA timer",
                    ),
                ),
            ],
            options={
                "verbose_name": "SLA breach",
                "verbose_name_plural": "SLA breaches",
                "ordering": ("-occurred_at",),
            },
        ),
        migrations.AddIndex(
            model_name="slapolicy",
            index=models.Index(
                fields=["tenant", "organization_node"], name="sla_engine__tenant__b5a45a_idx"
            ),
        ),
        migrations.AddIndex(
            model_name="slapolicy",
            index=models.Index(
                fields=["tenant", "sla_type", "is_active"], name="sla_policy_tenant_type_active"
            ),
        ),
        migrations.AddConstraint(
            model_name="slapolicy",
            constraint=models.UniqueConstraint(
                fields=("tenant", "name"), name="sla_policy_unique_tenant_name"
            ),
        ),
        migrations.AddIndex(
            model_name="slatimer",
            index=models.Index(
                fields=["tenant", "is_breached", "is_stopped"], name="sla_timer_brchd_stpd"
            ),
        ),
        migrations.AddIndex(
            model_name="slatimer",
            index=models.Index(fields=["tenant", "target_at"], name="sla_timer_tenant_target"),
        ),
        migrations.AddIndex(
            model_name="slatimer",
            index=models.Index(
                fields=["content_type", "object_id"], name="sla_timer_content_object"
            ),
        ),
        migrations.AddIndex(
            model_name="slatimer",
            index=models.Index(fields=["warning_at", "warning_sent"], name="sla_timer_warning"),
        ),
        migrations.AddConstraint(
            model_name="slatimer",
            constraint=models.UniqueConstraint(
                fields=("policy", "content_type", "object_id"),
                name="sla_timer_unique_policy_entity",
            ),
        ),
        migrations.AddIndex(
            model_name="slabreach",
            index=models.Index(fields=["tenant", "status"], name="sla_breach_tenant_status"),
        ),
        migrations.AddIndex(
            model_name="slabreach",
            index=models.Index(fields=["tenant", "occurred_at"], name="sla_breach_tenant_occurred"),
        ),
    ]
