# Generated manually for WorkItem canonical platform model migration.

import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ("organizations", "0002_workspace_template_user_context_pref"),
        ("tenants", "0001_initial"),
        ("iam", "__first__"),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        ("workbox", "0001_initial"),
    ]

    operations = [
        # ── 1. Remove indexes that reference 'user' column ──────────
        migrations.RemoveIndex(
            model_name="workboxitem",
            name="workbox_tenant_user_status",
        ),
        migrations.RemoveIndex(
            model_name="workboxitem",
            name="workbox_tenant_user_type_sts",
        ),
        migrations.RemoveIndex(
            model_name="workboxitem",
            name="workbox_tenant_user_due",
        ),
        migrations.RemoveIndex(
            model_name="workboxitem",
            name="workbox_tenant_user_dlgtd",
        ),
        migrations.RemoveIndex(
            model_name="workboxitem",
            name="workbox_source_lookup",
        ),
        migrations.RemoveIndex(
            model_name="workboxitem",
            name="workbox_wor_tenant__2337b9_idx",
        ),

        # ── 2. Rename table ─────────────────────────────────────────
        migrations.RenameModel(
            old_name="WorkboxItem",
            new_name="WorkItem",
        ),

        # ── 3. Rename user → assigned_to_user ───────────────────────
        migrations.RenameField(
            model_name="workitem",
            old_name="user",
            new_name="assigned_to_user",
        ),

        # ── 4. Alter assigned_to_user on_delete CASCADE → SET_NULL ──
        migrations.AlterField(
            model_name="workitem",
            name="assigned_to_user",
            field=models.ForeignKey(
                blank=True,
                db_index=True,
                null=True,
                on_delete=django.db.models.deletion.SET_NULL,
                related_name="work_items_assigned",
                to=settings.AUTH_USER_MODEL,
                verbose_name="assigned to user",
            ),
        ),

        # ── 5. Add new fields ───────────────────────────────────────
        migrations.AddField(
            model_name="workitem",
            name="assigned_to_role",
            field=models.ForeignKey(
                blank=True,
                null=True,
                on_delete=django.db.models.deletion.SET_NULL,
                related_name="work_items",
                to="iam.role",
                verbose_name="assigned to role",
            ),
        ),
        migrations.AddField(
            model_name="workitem",
            name="assigned_to_unit",
            field=models.ForeignKey(
                blank=True,
                null=True,
                on_delete=django.db.models.deletion.SET_NULL,
                related_name="work_items",
                to="organizations.organizationnode",
                verbose_name="assigned to unit",
            ),
        ),
        migrations.AddField(
            model_name="workitem",
            name="created_by",
            field=models.ForeignKey(
                blank=True,
                editable=False,
                null=True,
                on_delete=django.db.models.deletion.SET_NULL,
                related_name="+",
                to=settings.AUTH_USER_MODEL,
                verbose_name="created by",
            ),
        ),
        migrations.AddField(
            model_name="workitem",
            name="updated_by",
            field=models.ForeignKey(
                blank=True,
                editable=False,
                null=True,
                on_delete=django.db.models.deletion.SET_NULL,
                related_name="+",
                to=settings.AUTH_USER_MODEL,
                verbose_name="updated by",
            ),
        ),
        migrations.AddField(
            model_name="workitem",
            name="summary",
            field=models.CharField(
                blank=True, default="", max_length=300, verbose_name="summary"
            ),
        ),
        migrations.AddField(
            model_name="workitem",
            name="source_type",
            field=models.CharField(
                blank=True,
                default="",
                help_text="Semantic source type: assignment, approval, task, ticket, review, custom",
                max_length=50,
                verbose_name="source type",
            ),
        ),

        # ── 6. Alter status field to include cancelled/expired ───────
        migrations.AlterField(
            model_name="workitem",
            name="status",
            field=models.CharField(
                choices=[
                    ("pending", "Pending"),
                    ("in_progress", "In Progress"),
                    ("overdue", "Overdue"),
                    ("completed", "Completed"),
                    ("cancelled", "Cancelled"),
                    ("expired", "Expired"),
                ],
                db_index=True,
                default="pending",
                max_length=16,
                verbose_name="status",
            ),
        ),

        # ── 7. Alter item_type field to include ticket/review/custom ─
        migrations.AlterField(
            model_name="workitem",
            name="item_type",
            field=models.CharField(
                choices=[
                    ("assignment", "Assignment"),
                    ("approval", "Approval"),
                    ("task", "Task"),
                    ("workflow_step", "Workflow Step"),
                    ("ticket", "Ticket"),
                    ("review", "Review"),
                    ("custom", "Custom"),
                    ("notification", "Notification"),
                ],
                db_index=True,
                max_length=20,
                verbose_name="item type",
            ),
        ),

        # ── 8. Alter model options ──────────────────────────────────
        migrations.AlterModelOptions(
            name="workitem",
            options={
                "verbose_name": "work item",
                "verbose_name_plural": "work items",
                "ordering": ("-created_at",),
            },
        ),

        # ── 9. Recreate indexes with new field names ────────────────
        migrations.AddIndex(
            model_name="workitem",
            index=models.Index(
                fields=["tenant", "organization_node"], name="wi_tenant_org_idx"
            ),
        ),
        migrations.AddIndex(
            model_name="workitem",
            index=models.Index(
                fields=["tenant", "assigned_to_user", "status"], name="wi_tenant_user_status"
            ),
        ),
        migrations.AddIndex(
            model_name="workitem",
            index=models.Index(
                fields=["tenant", "assigned_to_user", "item_type", "status"],
                name="wi_tenant_user_type_sts",
            ),
        ),
        migrations.AddIndex(
            model_name="workitem",
            index=models.Index(
                fields=["tenant", "assigned_to_user", "due_date"], name="wi_tenant_user_due"
            ),
        ),
        migrations.AddIndex(
            model_name="workitem",
            index=models.Index(
                fields=["tenant", "assigned_to_user", "is_delegated"], name="wi_tenant_user_dlgtd"
            ),
        ),
        migrations.AddIndex(
            model_name="workitem",
            index=models.Index(
                fields=["source_entity", "source_id"], name="wi_source_lookup"
            ),
        ),
        migrations.AddIndex(
            model_name="workitem",
            index=models.Index(
                fields=["tenant", "item_type", "status"], name="wi_tenant_type_status"
            ),
        ),

        # ── 10. Create WorkItemTimeline model ───────────────────────
        migrations.CreateModel(
            name="WorkItemTimeline",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                ("event", models.CharField(max_length=64, verbose_name="event")),
                (
                    "from_status",
                    models.CharField(blank=True, default="", max_length=16, verbose_name="from status"),
                ),
                (
                    "to_status",
                    models.CharField(blank=True, default="", max_length=16, verbose_name="to status"),
                ),
                ("note", models.TextField(blank=True, default="", verbose_name="note")),
                (
                    "metadata",
                    models.JSONField(blank=True, default=dict, verbose_name="metadata"),
                ),
                (
                    "created_at",
                    models.DateTimeField(
                        auto_now_add=True, db_index=True, verbose_name="created at"
                    ),
                ),
                (
                    "actor",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="work_item_timeline_entries",
                        to=settings.AUTH_USER_MODEL,
                        verbose_name="actor",
                    ),
                ),
                (
                    "work_item",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="timeline",
                        to="workbox.workitem",
                        verbose_name="work item",
                    ),
                ),
            ],
            options={
                "verbose_name": "work item timeline entry",
                "verbose_name_plural": "work item timeline entries",
                "ordering": ("-created_at",),
                "indexes": [
                    models.Index(fields=["work_item", "event"], name="wi_timeline_wi_event"),
                    models.Index(fields=["work_item", "created_at"], name="wi_timeline_wi_created"),
                ],
            },
        ),
    ]
