from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.urls import reverse


from adhesions.models import Adhesion, User, Corporation


class Profile(models.Model):
    user = models.OneToOneField(User, related_name='profile', verbose_name='Utilisateur')
    phone_number = models.CharField(max_length=16, blank=True, default='',
                                    verbose_name='Numéro de téléphone')
    address = models.TextField(blank=True, default='', verbose_name='Adresse')
    notes = models.TextField(blank=True, default='')

    class Meta:
        verbose_name = 'profil'

    @property
    def adhesion(self): # user adhesion
        ctype = ContentType.objects.get_for_model(User)
        try:
            return Adhesion.objects.get(adherent_type=ctype, adherent_id=self.user.pk)
        except Adhesion.DoesNotExist:
            return None

    @property
    def adhesions(self): # user and corporations (for which the user is a member) adhesions
        user_type = ContentType.objects.get_for_model(User)
        corp_type = ContentType.objects.get_for_model(Corporation)
        return Adhesion.objects.filter(
            models.Q(adherent_type=user_type, adherent_id=self.user.pk)
            | models.Q(adherent_type=corp_type, adherent_id__in=Corporation.objects.filter(members=self.user).values_list('pk'))
        )

    def __str__(self):
        return self.user.get_full_name() or self.user.username