from django.core.exceptions import ValidationError
from django.db import models


class SecondaryCompetency(models.Model):
    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)

    class Meta:
        ordering = ["code"]
        db_table = "app_secondarycompetency"

    def __str__(self):
        return f"{self.code} - {self.name}"


class SubjectCompetency(models.Model):
    subject = models.ForeignKey("app.Subject", on_delete=models.CASCADE, related_name="secondary_competencies")
    competency = models.ForeignKey(
        SecondaryCompetency,
        on_delete=models.CASCADE,
        related_name="subject_links",
    )
    section = models.ForeignKey("app.Section", on_delete=models.CASCADE, related_name="subject_competencies")
    is_core = models.BooleanField(default=True)

    class Meta:
        unique_together = ("subject", "competency")
        db_table = "app_subjectcompetency"

    def __str__(self):
        return f"{self.subject} - {self.competency}"

    def clean(self):
        if self.subject_id and self.section_id and self.subject.section_id != self.section_id:
            raise ValidationError("Subject competency section must match the subject section.")

    def save(self, *args, **kwargs):
        if self.subject_id and not self.section_id:
            self.section = self.subject.section
        super().save(*args, **kwargs)
