# geo/models.py
from django.db import models

class State(models.Model):
    name = models.CharField(max_length=100, unique=True)
    state_type = models.CharField(max_length=10, blank=True, null=True)  # S or UT

    class Meta:
        ordering = ['name']

    def __str__(self):
        return self.name


class District(models.Model):
    name = models.CharField(max_length=100)
    state = models.ForeignKey(State, on_delete=models.CASCADE, related_name="districts")

    class Meta:
        unique_together = ('name', 'state')
        ordering = ['state__name', 'name']

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


class Location(models.Model):
    name = models.CharField(max_length=150)
    pincode = models.CharField(max_length=6)
    district = models.ForeignKey(District, on_delete=models.CASCADE, related_name="locations")
    state = models.ForeignKey(State, on_delete=models.CASCADE, related_name="locations")

    class Meta:
        unique_together = ('name', 'pincode')
        ordering = ['pincode', 'name']

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


class LocationPart(models.Model):
    base_location = models.ForeignKey(Location, on_delete=models.CASCADE, related_name="nearby_parts")
    nearby_location = models.CharField(max_length=150)
    pincode = models.CharField(max_length=6)
    district = models.ForeignKey(District, on_delete=models.CASCADE, related_name="location_parts")
    state = models.ForeignKey(State, on_delete=models.CASCADE, related_name="location_parts")

    class Meta:
        ordering = ['base_location__pincode', 'nearby_location']

    def __str__(self):
        return f"{self.nearby_location} near {self.base_location.name} ({self.pincode})"
