from django.db import models

class Nazione(models.Model):
    class Meta:
        verbose_name = 'nazione'
        verbose_name_plural = 'nazione'

    def __str__(self):
        return str(self.descrizione)

    codifica = models.CharField(max_length=2)
    descrizione = models.CharField(null=True, max_length=250)


class Regione(models.Model):
    class Meta:
        verbose_name = 'regione'
        verbose_name_plural = 'regioni'
        ordering = ('nome',)

    def __str__(self):
        return str(self.nome)
    nome = models.CharField(primary_key=True, max_length=32,
                            blank=True, null=False, default='')


class Provincia(models.Model):
    class Meta:
        verbose_name = 'provincia'
        verbose_name_plural = 'province'
        ordering = ('nome_esteso',)

    def __str__(self):
        return f'[{self.sigla}] {self.nome_esteso}'
    sigla = models.CharField(primary_key=True,
                             max_length=2, null=False, blank=False)
    nome_esteso = models.CharField(max_length=50, null=False, blank=False)
    regione = models.ForeignKey(
        Regione, related_name='province', on_delete=models.PROTECT, null=False, blank=False)


class ComuneManager(models.Manager):
    def get_by_natural_key(self, nome, provincia):
        return self.get(nome__iexact=nome.strip(), provincia__sigla__iexact=provincia.strip())


class Comune(models.Model):
    class Meta:
        verbose_name = 'comune'
        verbose_name_plural = 'comuni'
        unique_together = ('nome', 'provincia',)
        ordering = ('nome','provincia_id',)

    objects = ComuneManager()

    def __str__(self):
        return f'{self.nome} ({self.provincia_id})'

    def save(self, *args, **kwargs):
        self.nome = self.nome.strip()
        self.provincia_id = self.provincia_id.strip().upper()
        super().save(*args, **kwargs)

    def natural_key(self):
        return (self.nome.strip(), self.provincia_id.strip().upper())

    nome = models.CharField(max_length=60)
    provincia = models.ForeignKey(
        Provincia, related_name='comuni', on_delete=models.PROTECT, null=False, blank=False)
    cap = models.ManyToManyField(to='CAP',related_name='comuni')
    codice_istat = models.CharField(max_length=6)
    codice_nazionale = models.CharField(max_length=4)


class CAP(models.Model):
    class Meta:
        verbose_name_plural = verbose_name = 'CAP'

    def __str__(self):
        return str(self.codice)
    codice = models.CharField(primary_key=True, max_length=5)


class DUG(models.Model):
    class Meta:
        verbose_name = 'denominazione urbanistica generica'
        verbose_name_plural = 'denominazioni urbanistiche generiche'
    
    def __str__(self):
        return self.nome.capitalize()
    
    nome = models.CharField(primary_key=True, max_length=40)


class AbstractIndirizzo(models.Model):
    class Meta:
        verbose_name = 'indirizzo'
        verbose_name_plural = 'indirizzi'
        abstract = True

    def __str__(self):
        altro = f'{self.altro},' if self.altro else ''
        return f"{altro} {self.dug} {self.duf} {self.civico}, {self.cap} {self.comune.nome} {self.comune.provincia_id}"

    dug = models.ForeignKey(DUG, blank=False, null=False, verbose_name='denominazione urbanistica generica', on_delete=models.PROTECT)
    duf = models.CharField(max_length=256, blank=False, null=False, verbose_name="denominazione urbanistica ufficiale", help_text="Il nome della via/piazza/ecc...")
    civico = models.CharField(max_length=256, blank=False, null=False)
    comune = models.ForeignKey(Comune, on_delete=models.PROTECT)
    cap = models.ForeignKey(CAP, on_delete=models.PROTECT)
    altro = models.CharField(max_length=2048, blank=True, null=False, default='', help_text='Es.: interno, scala, appartamento...')
    nazione = models.ForeignKey(Nazione, blank=True, null=True, on_delete=models.PROTECT)