from django.db import models
from django.conf import settings
from django.contrib.auth.models import Group
from django.contrib.auth import get_user_model
from django.contrib.contenttypes.models import ContentType

from guardian.shortcuts import assign_perm
from guardian.models import UserObjectPermission, GroupObjectPermission

from geonode.base.models import ResourceBase
from geonode.groups.models import GroupProfile


class Geocollection(models.Model):
    """
    A collection is a set of resources linked to a GeoNode group
    """
    group = models.ForeignKey(GroupProfile, related_name='group_collections', on_delete=models.CASCADE)
    resources = models.ManyToManyField(ResourceBase, related_name='resource_collections')
    name = models.CharField(max_length=128, unique=True)
    slug = models.SlugField(max_length=128, unique=True)

    def remove_object_permissions(self):
        UserObjectPermission.objects \
            .filter(content_type=ContentType.objects.get_for_model(self),
                    object_pk=self.id) \
            .delete()
        GroupObjectPermission.objects \
            .filter(content_type=ContentType.objects.get_for_model(self),
                    object_pk=self.id) \
            .delete()

    def set_default_permissions(self):
        """
        Set default permissions.
        """
        # remove all permissions
        self.remove_object_permissions()

        # default permissions for anonymous users
        anonymous_group, created = Group.objects.get_or_create(name='anonymous')

        # assign permissions to 'Anyone' if 'DEFAULT_ANONYMOUS_VIEW_PERMISSION' is True
        if settings.DEFAULT_ANONYMOUS_VIEW_PERMISSION:
            assign_perm('access_geocollection', anonymous_group, self)

        # default permissions to the Geocollection group members
        assign_perm('access_geocollection', self.group.group, self)

    def __str__(self):
        return self.name

    class Meta:
        permissions = (
            ('access_geocollection', 'Can view geocollection'),
        )