from django.db import models
from django.utils import timezone


class County(models.Model):
    name = models.CharField(max_length=120, unique=True, db_index=True)
    created_at = models.DateTimeField(default=timezone.now)
    updated_at = models.DateTimeField(default=timezone.now)

    class Meta:
        ordering = ["name", "id"]
        verbose_name_plural = "counties"

    def __str__(self):
        return self.name


class SubCounty(models.Model):
    county = models.ForeignKey(
        County,
        on_delete=models.CASCADE,
        related_name="sub_counties",
    )
    name = models.CharField(max_length=120, db_index=True)
    created_at = models.DateTimeField(default=timezone.now)
    updated_at = models.DateTimeField(default=timezone.now)

    class Meta:
        ordering = ["county__name", "name", "id"]
        constraints = [
            models.UniqueConstraint(
                fields=["county", "name"],
                name="unique_sub_county_per_county",
            ),
        ]
        indexes = [
            models.Index(fields=["county", "name"]),
        ]

    def __str__(self):
        return f"{self.name}, {self.county.name}"


class Division(models.Model):
    sub_county = models.ForeignKey(
        SubCounty,
        on_delete=models.CASCADE,
        related_name="divisions",
    )
    name = models.CharField(max_length=120, db_index=True)
    created_at = models.DateTimeField(default=timezone.now)
    updated_at = models.DateTimeField(default=timezone.now)

    class Meta:
        ordering = ["sub_county__county__name", "sub_county__name", "name", "id"]
        constraints = [
            models.UniqueConstraint(
                fields=["sub_county", "name"],
                name="unique_division_per_sub_county",
            ),
        ]
        indexes = [
            models.Index(fields=["sub_county", "name"]),
        ]

    def __str__(self):
        return f"{self.name}, {self.sub_county.name}"


class Location(models.Model):
    division = models.ForeignKey(
        Division,
        on_delete=models.CASCADE,
        related_name="locations",
    )
    name = models.CharField(max_length=120, db_index=True)
    created_at = models.DateTimeField(default=timezone.now)
    updated_at = models.DateTimeField(default=timezone.now)

    class Meta:
        ordering = [
            "division__sub_county__county__name",
            "division__sub_county__name",
            "division__name",
            "name",
            "id",
        ]
        constraints = [
            models.UniqueConstraint(
                fields=["division", "name"],
                name="unique_location_per_division",
            ),
        ]
        indexes = [
            models.Index(fields=["division", "name"]),
        ]

    def __str__(self):
        return f"{self.name}, {self.division.name}"


class SubLocation(models.Model):
    location = models.ForeignKey(
        Location,
        on_delete=models.CASCADE,
        related_name="sub_locations",
    )
    name = models.CharField(max_length=120, db_index=True)
    created_at = models.DateTimeField(default=timezone.now)
    updated_at = models.DateTimeField(default=timezone.now)

    class Meta:
        ordering = [
            "location__division__sub_county__county__name",
            "location__division__sub_county__name",
            "location__division__name",
            "location__name",
            "name",
            "id",
        ]
        indexes = [
            models.Index(fields=["location", "name"]),
        ]

    def __str__(self):
        return f"{self.name}, {self.location.name}"

