from django.contrib import admin
from django.db.models import Q
from django.utils import timezone

from .models import Service, ServiceType, IPResource


class ServiceTypeFilter(admin.SimpleListFilter):
    title = 'type de service'
    parameter_name = 'type'

    def lookups(self, request, model_admin):
        return ServiceType.objects.all().values_list('pk', 'name')

    def queryset(self, request, queryset):
        if self.value():
            return queryset.filter(service_type__pk=self.value())


class ServiceStatusFilter(admin.SimpleListFilter):
    title = 'status du service'
    parameter_name = 'status'

    def lookups(self, request, model_admin):
        return (
            ('ongoing', 'En cours'),
            ('finished', 'Terminé'),
        )

    def queryset(self, request, queryset):
        if self.value() == 'ongoing':
            return queryset.filter(end__isnull=True)
        if self.value() == 'finished':
            return queryset.filter(end__isnull=False)


class ServiceAdmin(admin.ModelAdmin):
    list_display = ('id', 'adherent', 'service_type', 'start', 'end_view',)
    list_filter = (ServiceStatusFilter, ServiceTypeFilter,)

    def end_view(self, obj):
        return obj.end
    end_view.short_description = 'Fin du service'
    end_view.empty_value_display = 'Service en cours'


class InUseFilter(admin.SimpleListFilter):
    title = 'disponibilité'
    parameter_name = 'available'

    def lookups(self, request, model_admin):
        return (
            (1, 'Disponible'),
            (0, 'Non disponible'),
        )

    def queryset(self, request, queryset):
        in_use_filter = Q(service__start__gte=timezone.now()) \
                | Q(service__end__isnull=True)
        if self.value() == '0':
            return queryset.filter(in_use_filter)
        if self.value() == '1':
            return queryset.exclude(in_use_filter)


class IPResourceAdmin(admin.ModelAdmin):
    list_display = ('__str__', 'in_use_view')
    list_filter = (InUseFilter,)

    def in_use_view(self, obj):
        return not obj.in_use
    in_use_view.short_description = 'Disponible'
    in_use_view.boolean = True


admin.site.register(Service, ServiceAdmin)
admin.site.register(ServiceType)
admin.site.register(IPResource, IPResourceAdmin)