from django.db import models
from django.contrib.auth.models import Group
from django.contrib.auth import get_user_model
from django.contrib.contenttypes.fields import (
    GenericForeignKey, GenericRelation
)
from django.contrib.contenttypes.models import ContentType
from django.utils.translation import ugettext_lazy as _

User = get_user_model()


class Subscription(models.Model):
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

    class Meta:
        abstract = True


class UserSubscription(Subscription):
    user = models.ForeignKey(User)
    is_unsub = models.BooleanField(
        _("désinscription"),
        default=False
    )

    class Meta:
        verbose_name = _("souscription utilisateur")


class GroupSubscription(Subscription):
    group = models.ForeignKey(Group)

    class Meta:
        verbose_name = _("souscription en groupe")


class SubscriptionMixin(models.Model):
    subscribed_users = GenericRelation(UserSubscription)
    subscribed_groups = GenericRelation(GroupSubscription)

    def get_manual_subscribers(self):
        return self.subscribed_users.filter(is_unsub=False)

    def get_subscribers_from_groups(self):
        return User.objects.filter(group__in=self.subscribed_groups.all())

    def get_all_subscribers(self):
        return (self.get_manual_subscribers()
                    .union(self.get_subscribers_from_groups())
                    .exclude(is_unsub=True))

    class Meta:
        abstract = True