import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = []

    operations = [
        migrations.CreateModel(
            name="PCFFramework",
            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")),
                ("code", models.CharField(help_text='Unique identifier, e.g. "PCF-CI-7.2.1-EN"', max_length=64, unique=True, verbose_name="code")),
                ("name", models.CharField(max_length=256, verbose_name="name")),
                ("industry", models.CharField(
                    choices=[
                        ("cross_industry", "Cross-Industry"),
                        ("automotive", "Automotive"),
                        ("healthcare", "Healthcare"),
                        ("education", "Education"),
                        ("financial", "Financial Services"),
                        ("energy", "Energy & Utilities"),
                        ("retail", "Retail"),
                        ("telecom", "Telecom"),
                        ("government", "Government / Public Sector"),
                        ("construction", "Construction"),
                        ("manufacturing", "Manufacturing"),
                        ("other", "Other"),
                    ],
                    db_index=True,
                    default="cross_industry",
                    max_length=32,
                    verbose_name="industry",
                )),
                ("version", models.CharField(help_text='e.g. "7.2.1"', max_length=32, verbose_name="version")),
                ("language", models.CharField(default="en", help_text='ISO 639-1 code, e.g. "en", "fa", "ar"', max_length=8, verbose_name="language")),
                ("description", models.TextField(blank=True, verbose_name="description")),
                ("source_url", models.URLField(blank=True, verbose_name="source URL")),
                ("is_active", models.BooleanField(db_index=True, default=True, verbose_name="active")),
            ],
            options={"verbose_name": "PCF framework", "verbose_name_plural": "PCF frameworks", "ordering": ("industry", "version")},
        ),
        migrations.CreateModel(
            name="PCFElement",
            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")),
                ("pcf_id", models.PositiveIntegerField(db_index=True, help_text="Official APQC numeric identifier, e.g. 10002", verbose_name="PCF ID")),
                ("hierarchy_id", models.CharField(db_index=True, help_text='Dot-notation level code, e.g. "1.1.1"', max_length=32, verbose_name="hierarchy ID")),
                ("level", models.PositiveSmallIntegerField(
                    choices=[(1, "Category (L1)"), (2, "Process Group (L2)"), (3, "Process (L3)"), (4, "Activity (L4)")],
                    db_index=True,
                    verbose_name="level",
                )),
                ("name_en", models.CharField(max_length=512, verbose_name="name (EN)")),
                ("name_fa", models.CharField(blank=True, max_length=512, verbose_name="name (FA)")),
                ("name_ar", models.CharField(blank=True, max_length=512, verbose_name="name (AR)")),
                ("definition_en", models.TextField(blank=True, verbose_name="definition (EN)")),
                ("definition_fa", models.TextField(blank=True, verbose_name="definition (FA)")),
                ("order", models.PositiveSmallIntegerField(db_index=True, default=0, verbose_name="order")),
                ("is_active", models.BooleanField(db_index=True, default=True, verbose_name="active")),
                ("framework", models.ForeignKey(
                    on_delete=django.db.models.deletion.CASCADE,
                    related_name="elements",
                    to="bpm.pcfframework",
                    verbose_name="framework",
                )),
                ("parent", models.ForeignKey(
                    blank=True,
                    null=True,
                    on_delete=django.db.models.deletion.CASCADE,
                    related_name="children",
                    to="bpm.pcfelement",
                    verbose_name="parent",
                )),
            ],
            options={"verbose_name": "PCF element", "verbose_name_plural": "PCF elements", "ordering": ("framework", "order", "hierarchy_id")},
        ),
        migrations.CreateModel(
            name="PCFMetric",
            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")),
                ("metric_id", models.CharField(db_index=True, help_text="APQC metric identifier, e.g. 101337", max_length=32, verbose_name="metric ID")),
                ("category", models.CharField(
                    choices=[
                        ("efficiency", "Process Efficiency"),
                        ("effectiveness", "Process Effectiveness"),
                        ("cycle_time", "Process Cycle Time"),
                        ("cost", "Process Cost"),
                        ("quality", "Process Quality"),
                        ("other", "Other"),
                    ],
                    db_index=True,
                    default="other",
                    max_length=32,
                    verbose_name="category",
                )),
                ("name", models.CharField(max_length=512, verbose_name="name")),
                ("formula", models.TextField(blank=True, verbose_name="formula")),
                ("unit", models.CharField(blank=True, max_length=128, verbose_name="unit")),
                ("description", models.TextField(blank=True, verbose_name="description")),
                ("pcf_element", models.ForeignKey(
                    on_delete=django.db.models.deletion.CASCADE,
                    related_name="metrics",
                    to="bpm.pcfelement",
                    verbose_name="PCF element",
                )),
            ],
            options={"verbose_name": "PCF metric", "verbose_name_plural": "PCF metrics", "ordering": ("pcf_element", "metric_id")},
        ),
        migrations.AddIndex(
            model_name="pcfframework",
            index=models.Index(fields=["industry", "is_active"], name="bpm_pcffram_industr_idx"),
        ),
        migrations.AddIndex(
            model_name="pcfelement",
            index=models.Index(fields=["framework", "level"], name="bpm_pcfelem_framew_level_idx"),
        ),
        migrations.AddIndex(
            model_name="pcfelement",
            index=models.Index(fields=["framework", "hierarchy_id"], name="bpm_pcfelem_framew_hier_idx"),
        ),
        migrations.AddConstraint(
            model_name="pcfelement",
            constraint=models.UniqueConstraint(
                fields=("framework", "pcf_id"),
                name="bpm_pcfelement_unique_pcf_id_per_framework",
            ),
        ),
        migrations.AddConstraint(
            model_name="pcfelement",
            constraint=models.UniqueConstraint(
                fields=("framework", "hierarchy_id"),
                name="bpm_pcfelement_unique_hierarchy_id_per_framework",
            ),
        ),
        migrations.AddConstraint(
            model_name="pcfmetric",
            constraint=models.UniqueConstraint(
                fields=("pcf_element", "metric_id"),
                name="bpm_pcfmetric_unique_metric_id_per_element",
            ),
        ),
    ]
