from django.contrib import admin
from django.utils.translation import ugettext as _
from games.forms import GameForm
from games.models import Game
from games.models import Platform
from games.models import Timeline


class PlatformAdmin(admin.ModelAdmin):
    list_display = ('shortname', 'name')


class StatusFilter(admin.SimpleListFilter):
    """
    Remove CREATED status.
    """
    title = _('state')
    parameter_name = 'status'

    def lookups(self, request, model_admin):
        """
        Return only games choices (not CREATED from Item abstract class).
        """
        return Game.STATUS_CHOICES

    def queryset(self, request, queryset):
        """
        Filter on 'status' field.
        """
        if self.value():
            return queryset.filter(status=self.value())
        else:
            return queryset


class PlatformFilter(admin.SimpleListFilter):
    """
    Display Platform shortname.
    """
    title = _('platform')
    parameter_name = 'collection'

    def lookups(self, request, model_admin):
        """
        Get all platforms
        """
        return [(x.id, x.shortname) for x in Platform.objects.all()]

    def queryset(self, request, queryset):
        """
        Filter on 'shortname' field.
        """
        if self.value():
            return queryset.filter(collection__id=self.value())
        else:
            return queryset


class GameAdmin(admin.ModelAdmin):
    list_display = ('name', 'get_platform', 'playing', 'status', 'wish')
    list_filter = [StatusFilter, PlatformFilter, 'playing', 'wish']
    search_fields = ('name', )
    fieldsets = [(_('Game Information'), {
        'fields': [('name', 'collection')]
    }), (_('Progress'), {
        'fields': [('status'), ('achievement', 'achievement_max'), ('note')]
    }), ('', {
        'fields': [('playing'), ('unplayed'), ('wish')]
    })]

    form = GameForm

    def get_platform(self, obj):
        """
        Display platform shortname
        """
        return obj.collection.shortname

    get_platform.short_description = _('Platform')
    get_platform.admin_order_field = 'collection__shortname'


class TimelinePlatformFilter(admin.SimpleListFilter):
    """
    Display Platform shortname.
    """
    title = _('platform')
    parameter_name = 'collection'

    def lookups(self, request, model_admin):
        """
        Get all platforms
        """
        return [(x.id, x.shortname) for x in Platform.objects.all()]

    def queryset(self, request, queryset):
        """
        Filter on 'shortname' field.
        """
        if self.value():
            return queryset.filter(item__collection__id=self.value())
        else:
            return queryset


class TimelineAdmin(admin.ModelAdmin):
    list_display = ('date', 'status', 'item', 'get_platform')
    search_fields = ('item__name', )
    list_filter = (TimelinePlatformFilter, )

    def get_platform(self, obj):
        """
        Display platform shortname
        """
        return obj.item.collection.shortname

    get_platform.short_description = _('Platform')
    get_platform.admin_order_field = ('item__collection__shortname')


admin.site.register(Platform, PlatformAdmin)
admin.site.register(Game, GameAdmin)
admin.site.register(Timeline, TimelineAdmin)
