from django.db import models
from polymorphic.models import PolymorphicModel
from dati_geo_app.models import AbstractIndirizzo


class SoggettoContattabile(PolymorphicModel):
    """
    Questa è una classe padre astratta. È utilizzata come base per tutti i soggetti contattabili.
    """
    class Meta:
        verbose_name = 'soggetto contattabile'
        verbose_name_plural = 'soggetti contattabili'
    
    def __str__(self):
        return str(getattr(self,self.polymorphic_ctype.model))


class Recapito(PolymorphicModel):
    """
    Questo modello rappresenta i recapiti di contatto di un SoggettoContattabile,
    come telefoni, email, fax, ecc.
    """
    class Meta:
        verbose_name = 'recapito'
        verbose_name_plural = 'recapiti'
    
    soggetto = models.ForeignKey(SoggettoContattabile, on_delete=models.CASCADE, null=False,
                                         blank=False, related_name="contatti")

class PersonaFisica(SoggettoContattabile):
    """
    È child polimorfico, come PersonaGiuridica, di SoggettoContattabile e
    rappresenta una persone giuridica. Ha, come PersonaGiuridica, campi specifici
    per i dettagli dello specifico tipo di persona.
    """
    class Meta:
        verbose_name = 'persona fisica'
        verbose_name_plural = 'persone fisiche'

    def __str__(self):
        if self.nome:
            out = str(self.nome).strip()
        else:
            out = ''
        if self.cognome:
            out = f'{out} {self.cognome}'.strip()
        else:
            out = ''
        if not out:
            out = f'Persona fisica senza nome #{self.id}'
        if self.titolo:
            out=f'{self.titolo} {out}'
        return out

    titolo = models.CharField(null=False,blank=True,default='', max_length=10)
    nome = models.CharField(null=False,blank=False, max_length=60)
    cognome = models.CharField(null=False,blank=False, max_length=60)
    is_privato = models.BooleanField(null=False, blank=False, default=True)


class PersonaGiuridica(SoggettoContattabile):
    """
    È child polimorfico, come PersonaFisica, di SoggettoContattabile e
    rappresenta una persona fisica. Ha, come PersonaFisica, campi specifici
    per i dettagli dello specifico tipo di persona.
    """
    class Meta:
        verbose_name = 'persona giuridica'
        verbose_name_plural = 'persone giuridiche'

    def __str__(self):
        if self.denominazione:
            out = self.denominazione
        else:
            out = ''
        if not out.strip:
            out = 'Persona giuridica senza nome #{self.id}'
        return out

    denominazione = models.CharField(null=False,blank=False, max_length=80)


class Telefono(Recapito):
    class Meta:
        verbose_name = 'telefono'
        verbose_name_plural = 'telefono'

    def __str__(self):
        if self.interno:
            tel = f'{self.numero} (int.{self.interno})'
        else:
            tel = str(self.numero)
        if self.note:
            tel += ' (*)'
        return tel

    numero = models.CharField(null=False,blank=False,max_length=20)
    interno = models.CharField(null=False,blank=True,default='', max_length=20)
    note = models.CharField(null=False,blank=True,default='', max_length=64)


class Email(Recapito):
    class Meta:
        verbose_name = 'email'
        verbose_name_plural = 'email'

    def __str__(self):
        eml = self.indirizzo_email
        if self.note:
            eml += ' (*)'
        return eml

    indirizzo_email = models.EmailField(null=False,blank=False,max_length=254)
    note = models.CharField(null=False,blank=True,default='', max_length=64)


class Pec(Email):
    class Meta:
        verbose_name = 'pec'
        verbose_name_plural = 'pec'

    def __str__(self):
        eml = self.indirizzo_email
        if self.note:
            eml += ' (*)'
        return eml



class Fax(Recapito):
    class Meta:
        verbose_name = 'fax'
        verbose_name_plural = 'fax'

    def __str__(self):
        out = self.numero
        if self.note:
            out += ' (*)'
        return out.strip()

    numero = models.CharField(null=False,blank=False, max_length=20)
    note = models.CharField(null=False,blank=True,default='', max_length=64)

class Indirizzo(Recapito, AbstractIndirizzo):
    """
    Questo modello rappresenta un indirizzo fisico associato a un soggetto contattabile.
    Implementa AbstractIndirizzo, lo schema di indirizzi di django_geo_app.
    """
    class Meta(AbstractIndirizzo.Meta):
        pass


class Sede(Indirizzo):
    """
    Questo modello rappresenta una sede fisica di un'azienda.
    """
    class Meta:
        verbose_name = 'sede'
        verbose_name_plural = 'sedi'

    def __str__(self):
        out='Sede '
        if self.is_legale:
            out+='legale '
        else:
            out+='operativa '
        out+=f'di {self.dug} {self.duf} {self.civico}, {self.cap} {self.comune.nome} {self.comune.provincia_id}'
        return out

    societa = models.ForeignKey('Societa', on_delete=models.CASCADE,
                                  null=False, blank=False, related_name="sedi")
    is_legale = models.BooleanField(null=False, blank=False, default=False)


class Societa(models.Model):
    class Meta:
        verbose_name = 'società'
        verbose_name_plural = 'società'

    def __str__(self):
        if self.ragione_sociale:
            out = self.ragione_sociale
        else:
            out = str(self.soggetto)
        return out

    soggetto = models.OneToOneField(SoggettoContattabile, on_delete=models.CASCADE, null=False,
                                         blank=False, related_name="societa")
    ragione_sociale = models.CharField(max_length=1024)
    nazione = models.ForeignKey('dati_geo_app.Nazione', on_delete=models.CASCADE, null=True,
                                blank=True, related_name="societa")
    

class ContattoAziendale(models.Model):
    class Meta:
        verbose_name = 'Contatto aziendale'
        verbose_name_plural = 'Contatti aziendali'

    def __str__(self):
        return f'{self.persona} per {self.azienda}'

    persona = models.ForeignKey(PersonaFisica, on_delete=models.CASCADE, null=False,
                                blank=False, related_name='aziende_correlate')
    azienda = models.ForeignKey(Societa, on_delete=models.CASCADE, null=False,
                                blank=False, related_name='contatti_azienda')
    is_personale = models.BooleanField(null=False, blank=False, default=True)


# --------------- FINE PREFISSO TEMPLATE ---------------
