from django.db.models import Q
from django.views.generic import ListView
from rest_framework import viewsets

from .models import Game
from .models import Platform
from .models import Timeline
from .serializers import GameSerializer
from .serializers import GameTimelineSerializer
from .serializers import PlatformSerializer


class PlatformViewSet(viewsets.ModelViewSet):
    """
    API endpoints that allows platforms to be edited or viewed.

    retrieve:
    Return the given platform

    list:
    Return a list of all existing platforms ordered by name.

    create:
    Create a new platform instance.
    """
    queryset = Platform.objects.all().order_by('name')
    serializer_class = PlatformSerializer


class GameTimelineViewSet(viewsets.ModelViewSet):
    """
    API endpoints that allows to keep games life.
    BE CAREFUL. You shouldn't change these entries because they're generated
    by Game status change. It could be only useful to change the acquisition
    date. Not more.

    retrieve:
    Return the given timeline entry.

    list:
    Return a list of timeline entries sorted by date in descending order.

    create:
    Create a new timeline instance.
    """
    queryset = Timeline.objects.all().order_by('-date')
    serializer_class = GameTimelineSerializer


class GameViewSet(viewsets.ModelViewSet):
    """
    API endpoints that allows games to be edited or viewed.

    retrieve:
    Return the given game.

    list:
    Return a list of all existing games ordered by name.

    create:
    Create a new game instance.
    """
    queryset = Game.objects.all().order_by('name')
    serializer_class = GameSerializer


class GameList(ListView):
    model = Game
    context_object_name = 'non_excluded_games'
    template_name = 'games/index.html'
    queryset = Game.objects.filter(~Q(status=Game.EXCLUDED) & Q(
        wish=False)).order_by('name').prefetch_related('collection')


class SummaryList(ListView):
    model = Game
    context_object_name = 'playing_games'
    template_name = 'games/summary.html'
    queryset = Game.objects.filter(
        playing=True).order_by('name').prefetch_related('collection')

    def get_context_data(self, **kwargs):
        """
        Add playing games list.
        Add 5 last current activities from Timeline
        """
        context = super().get_context_data(**kwargs)
        context['last_timelines'] = Timeline.objects.filter(
            ~Q(item__status=Game.EXCLUDED)).order_by(
                '-date')[:5].prefetch_related('item__collection')
        return context
