from decimal import Decimal

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


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        ("app", "0069_move_secondary_models_to_secondary_app_state"),
    ]

    operations = [
        migrations.SeparateDatabaseAndState(
            database_operations=[],
            state_operations=[
                migrations.CreateModel(
                    name="SecondaryCompetency",
                    fields=[
                        ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
                        ("code", models.CharField(max_length=30, unique=True)),
                        ("name", models.CharField(max_length=120)),
                        ("description", models.TextField(blank=True, null=True)),
                        ("is_active", models.BooleanField(default=True)),
                    ],
                    options={
                        "db_table": "app_secondarycompetency",
                        "ordering": ["code"],
                    },
                ),
                migrations.CreateModel(
                    name="SecondaryComputationPolicy",
                    fields=[
                        ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
                        ("name", models.CharField(default="Uganda CBC Lower Secondary", max_length=100)),
                        (
                            "level",
                            models.CharField(
                                choices=[("LOWER_SECONDARY", "Lower Secondary (S1-S4)")],
                                default="LOWER_SECONDARY",
                                max_length=30,
                            ),
                        ),
                        ("ca_weight", models.DecimalField(decimal_places=2, default=Decimal("20.00"), max_digits=5)),
                        ("exam_weight", models.DecimalField(decimal_places=2, default=Decimal("80.00"), max_digits=5)),
                        (
                            "rounding_mode",
                            models.CharField(
                                choices=[
                                    ("ONE_DECIMAL", "One decimal place (69.4)"),
                                    ("WHOLE_NUMBER", "Whole number (half up)"),
                                    ("WHOLE_NUMBER_DOWN", "Whole number (floor)"),
                                ],
                                default="ONE_DECIMAL",
                                max_length=30,
                            ),
                        ),
                        ("effective_from", models.DateField(default=django.utils.timezone.now)),
                        ("effective_to", models.DateField(blank=True, null=True)),
                        ("is_active", models.BooleanField(default=True)),
                        ("created_at", models.DateTimeField(auto_now_add=True)),
                        ("updated_at", models.DateTimeField(auto_now=True)),
                        (
                            "section",
                            models.ForeignKey(
                                on_delete=django.db.models.deletion.CASCADE,
                                related_name="secondary_policies",
                                to="app.section",
                            ),
                        ),
                    ],
                    options={
                        "db_table": "app_secondarycomputationpolicy",
                        "ordering": ["-effective_from", "-id"],
                    },
                ),
                migrations.CreateModel(
                    name="UNEBSubmissionBatch",
                    fields=[
                        ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
                        ("title", models.CharField(default="S4 UNEB CA Submission", max_length=150)),
                        (
                            "level",
                            models.CharField(
                                choices=[("LOWER_SECONDARY", "Lower Secondary (S1-S4)")],
                                default="LOWER_SECONDARY",
                                max_length=30,
                            ),
                        ),
                        (
                            "status",
                            models.CharField(
                                choices=[
                                    ("DRAFT", "Draft"),
                                    ("PENDING_APPROVAL", "Pending Approval"),
                                    ("APPROVED", "Approved"),
                                    ("SUBMITTED", "Submitted to UNEB"),
                                    ("LOCKED", "Locked"),
                                    ("REJECTED", "Rejected"),
                                ],
                                default="DRAFT",
                                max_length=25,
                            ),
                        ),
                        ("submission_reference", models.CharField(blank=True, default="", max_length=100)),
                        ("notes", models.TextField(blank=True, null=True)),
                        ("approved_at", models.DateTimeField(blank=True, null=True)),
                        ("submitted_at", models.DateTimeField(blank=True, null=True)),
                        ("locked_at", models.DateTimeField(blank=True, null=True)),
                        ("created_at", models.DateTimeField(auto_now_add=True)),
                        ("updated_at", models.DateTimeField(auto_now=True)),
                        (
                            "academic_year",
                            models.ForeignKey(
                                on_delete=django.db.models.deletion.CASCADE,
                                related_name="uneb_ca_batches",
                                to="app.academicyear",
                            ),
                        ),
                        (
                            "approved_by",
                            models.ForeignKey(
                                blank=True,
                                null=True,
                                on_delete=django.db.models.deletion.SET_NULL,
                                related_name="uneb_ca_batches_approved",
                                to=settings.AUTH_USER_MODEL,
                            ),
                        ),
                        (
                            "candidate_class",
                            models.ForeignKey(
                                blank=True,
                                null=True,
                                on_delete=django.db.models.deletion.SET_NULL,
                                related_name="uneb_ca_batches",
                                to="app.class",
                            ),
                        ),
                        (
                            "created_by",
                            models.ForeignKey(
                                blank=True,
                                null=True,
                                on_delete=django.db.models.deletion.SET_NULL,
                                related_name="uneb_ca_batches_created",
                                to=settings.AUTH_USER_MODEL,
                            ),
                        ),
                        (
                            "section",
                            models.ForeignKey(
                                on_delete=django.db.models.deletion.CASCADE,
                                related_name="uneb_ca_batches",
                                to="app.section",
                            ),
                        ),
                        (
                            "submitted_by",
                            models.ForeignKey(
                                blank=True,
                                null=True,
                                on_delete=django.db.models.deletion.SET_NULL,
                                related_name="uneb_ca_batches_submitted",
                                to=settings.AUTH_USER_MODEL,
                            ),
                        ),
                    ],
                    options={
                        "db_table": "app_unebsubmissionbatch",
                        "ordering": ["-created_at"],
                    },
                ),
                migrations.CreateModel(
                    name="SubjectCompetency",
                    fields=[
                        ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
                        ("is_core", models.BooleanField(default=True)),
                        (
                            "competency",
                            models.ForeignKey(
                                on_delete=django.db.models.deletion.CASCADE,
                                related_name="subject_links",
                                to="secondary.secondarycompetency",
                            ),
                        ),
                        (
                            "section",
                            models.ForeignKey(
                                on_delete=django.db.models.deletion.CASCADE,
                                related_name="subject_competencies",
                                to="app.section",
                            ),
                        ),
                        (
                            "subject",
                            models.ForeignKey(
                                on_delete=django.db.models.deletion.CASCADE,
                                related_name="secondary_competencies",
                                to="app.subject",
                            ),
                        ),
                    ],
                    options={
                        "db_table": "app_subjectcompetency",
                        "unique_together": {("subject", "competency")},
                    },
                ),
                migrations.CreateModel(
                    name="ContinuousAssessmentTask",
                    fields=[
                        ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
                        ("title", models.CharField(max_length=150)),
                        (
                            "task_type",
                            models.CharField(
                                choices=[
                                    ("PROJECT", "Project"),
                                    ("PRACTICAL", "Practical"),
                                    ("COURSEWORK", "Coursework"),
                                    ("PORTFOLIO", "Portfolio"),
                                    ("PRESENTATION", "Presentation"),
                                    ("GROUP_WORK", "Group Work"),
                                    ("ORAL", "Oral Task"),
                                    ("FIELD_STUDY", "Field Study"),
                                    ("OTHER", "Other"),
                                ],
                                default="PROJECT",
                                max_length=30,
                            ),
                        ),
                        ("weight", models.DecimalField(decimal_places=2, default=Decimal("0.00"), max_digits=5)),
                        ("max_score", models.DecimalField(decimal_places=2, default=Decimal("100.00"), max_digits=6)),
                        ("assigned_date", models.DateField(default=django.utils.timezone.now)),
                        ("evidence_required", models.BooleanField(default=False)),
                        ("uneb_eligible", models.BooleanField(default=True)),
                        (
                            "status",
                            models.CharField(
                                choices=[
                                    ("DRAFT", "Draft"),
                                    ("PENDING_MODERATION", "Pending Moderation"),
                                    ("MODERATED", "Moderated"),
                                    ("APPROVED", "Approved"),
                                    ("LOCKED", "Locked"),
                                ],
                                default="DRAFT",
                                max_length=25,
                            ),
                        ),
                        ("approved_at", models.DateTimeField(blank=True, null=True)),
                        ("locked_at", models.DateTimeField(blank=True, null=True)),
                        ("created_at", models.DateTimeField(auto_now_add=True)),
                        ("updated_at", models.DateTimeField(auto_now=True)),
                        (
                            "academic_class",
                            models.ForeignKey(
                                on_delete=django.db.models.deletion.CASCADE,
                                related_name="ca_tasks",
                                to="app.academicclass",
                            ),
                        ),
                        (
                            "approved_by",
                            models.ForeignKey(
                                blank=True,
                                null=True,
                                on_delete=django.db.models.deletion.SET_NULL,
                                related_name="ca_tasks_approved",
                                to=settings.AUTH_USER_MODEL,
                            ),
                        ),
                        (
                            "created_by",
                            models.ForeignKey(
                                blank=True,
                                null=True,
                                on_delete=django.db.models.deletion.SET_NULL,
                                related_name="ca_tasks_created",
                                to=settings.AUTH_USER_MODEL,
                            ),
                        ),
                        (
                            "subject",
                            models.ForeignKey(
                                on_delete=django.db.models.deletion.CASCADE,
                                related_name="ca_tasks",
                                to="app.subject",
                            ),
                        ),
                        (
                            "subject_competency",
                            models.ForeignKey(
                                blank=True,
                                null=True,
                                on_delete=django.db.models.deletion.SET_NULL,
                                related_name="ca_tasks",
                                to="secondary.subjectcompetency",
                            ),
                        ),
                        (
                            "term",
                            models.ForeignKey(
                                on_delete=django.db.models.deletion.CASCADE,
                                related_name="ca_tasks",
                                to="app.term",
                            ),
                        ),
                    ],
                    options={
                        "db_table": "app_continuousassessmenttask",
                        "ordering": ["-assigned_date", "-id"],
                        "unique_together": {("academic_class", "subject", "title", "assigned_date")},
                    },
                ),
                migrations.CreateModel(
                    name="ContinuousAssessmentRecord",
                    fields=[
                        ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
                        ("raw_score", models.DecimalField(decimal_places=2, max_digits=6)),
                        ("moderated_score", models.DecimalField(blank=True, decimal_places=2, max_digits=6, null=True)),
                        ("teacher_comment", models.TextField(blank=True, null=True)),
                        ("evidence_reference", models.CharField(blank=True, default="", max_length=255)),
                        (
                            "moderation_status",
                            models.CharField(
                                choices=[
                                    ("DRAFT", "Draft"),
                                    ("PENDING", "Pending Moderation"),
                                    ("MODERATED", "Moderated"),
                                    ("APPROVED", "Approved"),
                                    ("LOCKED", "Locked"),
                                    ("REJECTED", "Rejected"),
                                ],
                                default="DRAFT",
                                max_length=20,
                            ),
                        ),
                        ("is_locked", models.BooleanField(default=False)),
                        ("created_at", models.DateTimeField(auto_now_add=True)),
                        ("updated_at", models.DateTimeField(auto_now=True)),
                        (
                            "entered_by",
                            models.ForeignKey(
                                blank=True,
                                null=True,
                                on_delete=django.db.models.deletion.SET_NULL,
                                related_name="ca_records_entered",
                                to=settings.AUTH_USER_MODEL,
                            ),
                        ),
                        (
                            "student",
                            models.ForeignKey(
                                on_delete=django.db.models.deletion.CASCADE,
                                related_name="ca_records",
                                to="app.student",
                            ),
                        ),
                        (
                            "task",
                            models.ForeignKey(
                                on_delete=django.db.models.deletion.CASCADE,
                                related_name="records",
                                to="secondary.continuousassessmenttask",
                            ),
                        ),
                        (
                            "updated_by",
                            models.ForeignKey(
                                blank=True,
                                null=True,
                                on_delete=django.db.models.deletion.SET_NULL,
                                related_name="ca_records_updated",
                                to=settings.AUTH_USER_MODEL,
                            ),
                        ),
                    ],
                    options={
                        "db_table": "app_continuousassessmentrecord",
                        "ordering": ["task_id", "student_id"],
                        "unique_together": {("task", "student")},
                    },
                ),
                migrations.CreateModel(
                    name="CAModeration",
                    fields=[
                        ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
                        (
                            "status",
                            models.CharField(
                                choices=[
                                    ("PENDING", "Pending"),
                                    ("APPROVED", "Approved"),
                                    ("REJECTED", "Rejected"),
                                    ("ADJUSTED", "Adjusted"),
                                ],
                                default="PENDING",
                                max_length=20,
                            ),
                        ),
                        ("moderated_score", models.DecimalField(blank=True, decimal_places=2, max_digits=6, null=True)),
                        ("comments", models.TextField(blank=True, null=True)),
                        ("moderated_at", models.DateTimeField(auto_now=True)),
                        (
                            "moderated_by",
                            models.ForeignKey(
                                blank=True,
                                null=True,
                                on_delete=django.db.models.deletion.SET_NULL,
                                related_name="ca_moderations_done",
                                to=settings.AUTH_USER_MODEL,
                            ),
                        ),
                        (
                            "record",
                            models.OneToOneField(
                                on_delete=django.db.models.deletion.CASCADE,
                                related_name="moderation",
                                to="secondary.continuousassessmentrecord",
                            ),
                        ),
                    ],
                    options={
                        "db_table": "app_camoderation",
                        "ordering": ["-moderated_at"],
                    },
                ),
                migrations.CreateModel(
                    name="UNEBSubmissionItem",
                    fields=[
                        ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
                        ("ca_mark", models.DecimalField(decimal_places=2, max_digits=5)),
                        ("final_ca_mark", models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True)),
                        ("source_task_count", models.PositiveIntegerField(default=0)),
                        ("evidence_count", models.PositiveIntegerField(default=0)),
                        (
                            "moderation_status",
                            models.CharField(
                                choices=[
                                    ("DRAFT", "Draft"),
                                    ("PENDING", "Pending Moderation"),
                                    ("MODERATED", "Moderated"),
                                    ("APPROVED", "Approved"),
                                    ("LOCKED", "Locked"),
                                    ("REJECTED", "Rejected"),
                                ],
                                default="PENDING",
                                max_length=20,
                            ),
                        ),
                        ("is_locked", models.BooleanField(default=False)),
                        ("created_at", models.DateTimeField(auto_now_add=True)),
                        ("updated_at", models.DateTimeField(auto_now=True)),
                        (
                            "batch",
                            models.ForeignKey(
                                on_delete=django.db.models.deletion.CASCADE,
                                related_name="items",
                                to="secondary.unebsubmissionbatch",
                            ),
                        ),
                        (
                            "student",
                            models.ForeignKey(
                                on_delete=django.db.models.deletion.CASCADE,
                                related_name="uneb_ca_items",
                                to="app.student",
                            ),
                        ),
                        (
                            "subject",
                            models.ForeignKey(
                                on_delete=django.db.models.deletion.CASCADE,
                                related_name="uneb_ca_items",
                                to="app.subject",
                            ),
                        ),
                    ],
                    options={
                        "db_table": "app_unebsubmissionitem",
                        "ordering": ["student_id", "subject_id"],
                        "unique_together": {("batch", "student", "subject")},
                    },
                ),
                migrations.CreateModel(
                    name="SecondaryGradeBand",
                    fields=[
                        ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
                        ("grade", models.CharField(max_length=5)),
                        ("descriptor", models.CharField(max_length=120)),
                        ("min_score", models.DecimalField(decimal_places=2, max_digits=5)),
                        ("max_score", models.DecimalField(decimal_places=2, max_digits=5)),
                        ("display_order", models.PositiveSmallIntegerField(default=0)),
                        (
                            "policy",
                            models.ForeignKey(
                                on_delete=django.db.models.deletion.CASCADE,
                                related_name="grade_bands",
                                to="secondary.secondarycomputationpolicy",
                            ),
                        ),
                    ],
                    options={
                        "db_table": "app_secondarygradeband",
                        "ordering": ["display_order", "-min_score"],
                        "unique_together": {("policy", "grade")},
                    },
                ),
            ],
        )
    ]
