# -*- mode: python; coding: utf-8 -*-
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
# se veut agnostique au réseau considéré, de manière à être installable en
# quelques clics.
#
# Copyright © 2018 Maël Kervella
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

from rest_framework import viewsets, generics, views
from django.db.models import Q
from django.contrib.auth.models import Group

from . import serializers
from api.pagination import PageSizedPagination
from api.permissions import ACLPermission
from re2o.utils import all_has_access
import users.models as users
import preferences.models as preferences


class UserViewSet(viewsets.ReadOnlyModelViewSet):
    """Exposes list and details of `users.models.Users` objects.
    """

    queryset = users.User.objects.all()
    serializer_class = serializers.UserSerializer


class HomeCreationViewSet(viewsets.ReadOnlyModelViewSet):
    """Exposes infos of `users.models.Users` objects to create homes.
    """

    queryset = users.User.objects.exclude(
        Q(state=users.User.STATE_DISABLED)
        | Q(state=users.User.STATE_NOT_YET_ACTIVE)
        | Q(state=users.User.STATE_FULL_ARCHIVE)
    )
    serializer_class = serializers.BasicUserSerializer


class NormalUserViewSet(viewsets.ReadOnlyModelViewSet):
    """Exposes infos of `users.models.Users`without specific rights objects."""

    queryset = users.User.objects.exclude(groups__listright__critical=True).distinct()
    serializer_class = serializers.BasicUserSerializer


class CriticalUserViewSet(viewsets.ReadOnlyModelViewSet):
    """Exposes infos of `users.models.Users`without specific rights objects."""

    queryset = users.User.objects.filter(groups__listright__critical=True).distinct()
    serializer_class = serializers.BasicUserSerializer


class ClubViewSet(viewsets.ReadOnlyModelViewSet):
    """Exposes list and details of `users.models.Club` objects.
    """

    queryset = users.Club.objects.all()
    serializer_class = serializers.ClubSerializer


class AdherentViewSet(viewsets.ReadOnlyModelViewSet):
    """Exposes list and details of `users.models.Adherent` objects.
    """

    queryset = users.Adherent.objects.all()
    serializer_class = serializers.AdherentSerializer


class ServiceUserViewSet(viewsets.ReadOnlyModelViewSet):
    """Exposes list and details of `users.models.ServiceUser` objects.
    """

    queryset = users.ServiceUser.objects.all()
    serializer_class = serializers.ServiceUserSerializer


class SchoolViewSet(viewsets.ReadOnlyModelViewSet):
    """Exposes list and details of `users.models.School` objects.
    """

    queryset = users.School.objects.all()
    serializer_class = serializers.SchoolSerializer


class ListRightViewSet(viewsets.ReadOnlyModelViewSet):
    """Exposes list and details of `users.models.ListRight` objects.
    """

    queryset = users.ListRight.objects.all()
    serializer_class = serializers.ListRightSerializer


class ShellViewSet(viewsets.ReadOnlyModelViewSet):
    """Exposes list and details of `users.models.ListShell` objects.
    """

    queryset = users.ListShell.objects.all()
    serializer_class = serializers.ShellSerializer


class BanViewSet(viewsets.ReadOnlyModelViewSet):
    """Exposes list and details of `users.models.Ban` objects.
    """

    queryset = users.Ban.objects.all()
    serializer_class = serializers.BanSerializer


class WhitelistViewSet(viewsets.ReadOnlyModelViewSet):
    """Exposes list and details of `users.models.Whitelist` objects.
    """

    queryset = users.Whitelist.objects.all()
    serializer_class = serializers.WhitelistSerializer


class EMailAddressViewSet(viewsets.ReadOnlyModelViewSet):
    """Exposes list and details of `users.models.EMailAddress` objects.
    """

    serializer_class = serializers.EMailAddressSerializer
    queryset = users.EMailAddress.objects.none()

    def get_queryset(self):
        if preferences.OptionalUser.get_cached_value("local_email_accounts_enabled"):
            return users.EMailAddress.objects.filter(user__local_email_enabled=True)
        else:
            return users.EMailAddress.objects.none()


class LocalEmailUsersView(generics.ListAPIView):
    """Exposes all the aliases of the users that activated the internal address
    """

    serializer_class = serializers.LocalEmailUsersSerializer

    def get_queryset(self):
        if preferences.OptionalUser.get_cached_value("local_email_accounts_enabled"):
            return users.User.objects.filter(local_email_enabled=True)
        else:
            return users.User.objects.none()


class StandardMailingView(views.APIView):
    """Exposes list and details of standard mailings (name and members) in
    order to building the corresponding mailing lists.
    """

    pagination_class = PageSizedPagination
    permission_classes = (ACLPermission,)
    perms_map = {"GET": [users.User.can_view_all]}

    def get(self, request, format=None):
        adherents_data = serializers.MailingMemberSerializer(
            all_has_access(), many=True
        ).data
        
        data = [{"name": "adherents", "members": adherents_data}]
        groups = Group.objects.all()
        for group in groups:
            group_data = serializers.MailingMemberSerializer(
                group.user_set.all(), many=True
            ).data
            data.append({"name": group.name, "members": group_data})

        paginator = self.pagination_class()
        paginator.paginate_queryset(data, request)
        return paginator.get_paginated_response(data)


class ClubMailingView(generics.ListAPIView):
    """Exposes list and details of club mailings (name, members and admins) in
    order to build the corresponding mailing lists.
    """

    queryset = users.Club.objects.all()
    serializer_class = serializers.MailingSerializer