from abc import ABC
from datetime import datetime

from django.contrib.admin import SimpleListFilter
from django.http import HttpResponseRedirect
from django.utils.translation import ugettext_lazy as _
from django.contrib import admin
from rangefilter.filters import DateRangeFilter, DateTimeRangeFilter
from django.urls import path

from ..models.customer import Customer
from ..models.customer import Sport
from ..mautic import MauticHelper
from ..cron import cron


class SportFilter(SimpleListFilter, ABC):
    title = "Sport"
    parameter_name = 'sport_id'

    def lookups(self, request, model_admin):
        data = []
        for s in Sport.objects.filter():
            data.append([s.sport_id, s.sport_name])
        return data

    def queryset(self, request, queryset):
        if self.value():
            return Customer.objects.filter(sport__sport_id=self.value())
        else:
            return queryset


class CustomerAdmin(admin.ModelAdmin):
    change_list_template = "controlling/mautic.html"
    list_display = ('customer_id', 'name','firstname', 'email', 'date_add', 'get_sport')
    list_filter = (
        ('date_add', DateRangeFilter),
        SportFilter
    )

    def get_sport(self, obj):
        return obj.sport.sport_name

    get_sport.short_description = 'Sport'
    get_sport.admin_order_field = 'sport__sport_name'


    # If you would like to add a default range filter
    # method pattern "get_rangefilter_{field_name}_default"
    def get_rangefilter_date_add_default(self, request):
        return (datetime.today(), datetime.today())

    # If you would like to change a title range filter
    # method pattern "get_rangefilter_{field_name}_title"
    def get_rangefilter_date_add_title(self, request, field_path):
        return _('Registered')

    def changelist_view(self, request, extra_context=None):
        if not request.GET.__contains__('date_add__range__gte'):
            q = request.GET.copy()
            q['date_add__range__gte'] = datetime.today()
            q['date_add__range__lte'] = datetime.today()
            request.GET = q
            request.META['QUERY_STRING'] = request.GET.urlencode()
        return super(CustomerAdmin, self).changelist_view(
            request, extra_context=extra_context)

    def get_urls(self):
        urls = super().get_urls()
        my_urls = [
            path('mautic/', self.set_mautic),
        ]
        return my_urls + urls

    def set_mautic(self, request):
        cron.sync_customers()
        self.message_user(request, "All heroes are now synced")
        return HttpResponseRedirect("../")


admin.site.register(Customer, CustomerAdmin)
admin.autodiscover()