from django.db.models import Count
from django.views import generic
from music.models import Album, Artist, Track
from scrobbles.models import ChartRecord
from scrobbles.stats import get_scrobble_count_qs


class TrackListView(generic.ListView):
    model = Track
    paginate_by = 200

    def get_queryset(self):
        return get_scrobble_count_qs(user=self.request.user).order_by(
            "-scrobble_count"
        )


class TrackDetailView(generic.DetailView):
    model = Track
    slug_field = 'uuid'

    def get_context_data(self, **kwargs):
        context_data = super().get_context_data(**kwargs)
        context_data['charts'] = ChartRecord.objects.filter(
            track=self.object, rank__in=[1, 2, 3]
        )
        return context_data


class ArtistListView(generic.ListView):
    model = Artist
    paginate_by = 100

    def get_queryset(self):
        return (
            super()
            .get_queryset()
            .annotate(scrobble_count=Count('track__scrobble'))
            .order_by("-scrobble_count")
        )

    def get_context_data(self, *, object_list=None, **kwargs):
        context_data = super().get_context_data(
            object_list=object_list, **kwargs
        )
        context_data['view'] = self.request.GET.get('view')
        return context_data


class ArtistDetailView(generic.DetailView):
    model = Artist
    slug_field = 'uuid'

    def get_context_data(self, **kwargs):
        context_data = super().get_context_data(**kwargs)
        artist = context_data['object']
        rank = 1
        tracks_ranked = []
        scrobbles = artist.tracks.first().scrobble_count
        for track in artist.tracks:
            if scrobbles > track.scrobble_count:
                rank += 1
            tracks_ranked.append((rank, track))
            scrobbles = track.scrobble_count

        context_data['tracks_ranked'] = tracks_ranked
        context_data['charts'] = ChartRecord.objects.filter(
            artist=self.object, rank__in=[1, 2, 3]
        )
        return context_data


class AlbumListView(generic.ListView):
    model = Album

    def get_queryset(self):
        return (
            super()
            .get_queryset()
            .annotate(scrobble_count=Count('track__scrobble'))
            .order_by("-scrobble_count")
        )


class AlbumDetailView(generic.DetailView):
    model = Album
    slug_field = 'uuid'

    def get_context_data(self, **kwargs):
        context_data = super().get_context_data(**kwargs)
        # context_data['charts'] = ChartRecord.objects.filter(
        #    track__album=self.object, rank__in=[1, 2, 3]
        # )
        return context_data
