# Copyright (C) 2020 by Animath
# SPDX-License-Identifier: GPL-3.0-or-later

from django.contrib.auth.models import User
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter
from rest_framework.permissions import BasePermission, IsAdminUser, IsAuthenticated, SAFE_METHODS
from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet

from .serializers import BasicUserSerializer, PaymentSerializer, RegistrationSerializer
from ..models import Payment, Registration


class RegistrationViewSet(ModelViewSet):
    queryset = Registration.objects.all()
    serializer_class = RegistrationSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['user', 'participantregistration__team', ]


class PaymentViewSet(ModelViewSet):
    queryset = Payment.objects.all()
    serializer_class = PaymentSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['registrations', 'grouped', 'amount', 'final', 'type', 'valid', ]


class IsTournamentOrganizer(BasePermission):
    def has_permission(self, request, view):
        reg = request.user.registration
        return request.method in SAFE_METHODS and reg.is_volunteer and reg.organized_tournaments.exists()


class VolunteersViewSet(ReadOnlyModelViewSet):
    queryset = User.objects.filter(registration__volunteerregistration__isnull=False)
    serializer_class = BasicUserSerializer
    permission_classes = [IsAdminUser | (IsAuthenticated & IsTournamentOrganizer)]
    filter_backends = [DjangoFilterBackend, SearchFilter]
    filterset_fields = ['first_name', 'last_name', 'email', ]
    search_fields = ['$first_name', '$last_name', '$email', ]