from django.contrib import admin
from .models import Betrieb, Partei, PresidentCandidate, Question, Angestellter,\
    Aufsicht, Betriebsaufsicht, Betriebsabrechnung, Betriebskredit
from startpage.models import Banned
from django.contrib.admin import helpers
from django.shortcuts import render
from django.template.defaulttags import register
from django.db import models
from django import forms
from easy_select2 import apply_select2


class ZugeteiltFilter(admin.SimpleListFilter):
    title = 'Zugeteilt'
    parameter_name = 'zugeteilt'
    default_value = ('Alle', None)

    def lookups(self, request, model_admin):
        return (
            ('Alle', 'Alle'),
            ('True', 'Zugeteilt'),
            # ('More', 'Mehrfach zugeteilt'),
            ('False', 'Nicht zugeteilt'),
        )

    def queryset(self, request, queryset):
        if self.value() == 'True':
            print("filter auf true")
            return queryset.filter(betriebe__gt=0).distinct()
        elif self.value() == 'False':
            print("filter auf false")
            return queryset.filter(betriebe__exact=None).distinct()
        elif self.value() is None:
            return queryset
        elif self.value() == 'All':
            return queryset

    def choices(self, cl):
        for lookup, title in self.lookup_choices:
            yield {
                'selected':
                    self.value() == lookup or
                    (self.value() is None and lookup == self.default_value[0]),
                'query_string': cl.get_query_string({
                                    self.parameter_name:
                                    lookup,
                                }, []),
                'display': title
            }


@register.filter
def get_item(dictionary, key):
        return dictionary.get(key)


def ban_ip(modeladmin, request, queryset):
    for obj in queryset:
        banned = Banned(ip_address=obj.ip_address,
                        reason="")
        banned.save()
    modeladmin.message_user(request, "Ausgewählte Urheber erfolgreich verbannt.")
ban_ip.short_description = "Urheber ausgewählter Eintrage verbannen"


def create_overview(modeladmin, request, queryset):
    if request.POST.get('back'):
        pass
    else:
        raummap = {}
        for b in queryset:
            if b.raum in raummap:
                raummap[b.raum]["anzahl"] += 1
                raummap[b.raum]["belegung"] += b.raumforderung
            else:
                raummap[b.raum] = {"anzahl": 1, "belegung": b.raumforderung}
        context = {'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME,
                   'betriebe': queryset,
                   'arbeitnehmer_gesamt': sum([b.arbeitnehmerzahl for b in
                                               queryset]),
                   'raummap': raummap,
                   'title': "Betriebsübersicht",
                   'kreditgesamt': sum([b.kredit for b in queryset])}
        return render(request, 'meingoethopia/betriebe_overview.html', context)

create_overview.short_description = "Übersicht erstellen"


def sum_umsatz(modeladmin, request, queryset):
    if request.POST.get('back'):
        pass
    else:
        betriebe = queryset
        klassen = {}
        umsatz_gesamt = 0
        for b in betriebe:
            u = sum([a.umsatz for a in b.betriebsabrechnung_set.all()])
            umsatz_gesamt += u
            try:
                u2 = u / b.angestellte.count()
            except ZeroDivisionError:
                u2 = 0
            for a in b.angestellte.all():
                if a.klasse not in klassen:
                    klassen[a.klasse] = u2
                else:
                    klassen[a.klasse] += u2
        anteile = {k: round((v / umsatz_gesamt) * 100, 2) for k, v in klassen.items()}
        context = {'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME,
                   'umsatz_gesamt': umsatz_gesamt,
                   'klassen': anteile,
                   'title': "Umsatzübersicht"}
        return render(request, 'meingoethopia/umsatz_view.html', context)

sum_umsatz.short_description = "Umsatzverteilung berechnen"


class AufsichtInline(admin.TabularInline):
    model = Betriebsaufsicht
    extra = 0
    formfield_overrides = {
        models.ManyToManyField: {'widget': forms.CheckboxSelectMultiple},
        models.ForeignKey: {'widget': apply_select2(forms.Select)}
    }


class BetriebsabrechnungInline(admin.TabularInline):
    model = Betriebsabrechnung
    extra = 0
    formfield_overrides = {
        models.ManyToManyField: {'widget': forms.CheckboxSelectMultiple},
        models.ForeignKey: {'widget': apply_select2(forms.Select)}
    }
    template = "meingoethopia/betriebsabrechnung.html"


class BetriebskreditInline(admin.TabularInline):
    model = Betriebskredit
    extra = 0
    formfield_overrides = {
        models.ManyToManyField: {'widget': forms.CheckboxSelectMultiple},
        models.ForeignKey: {'widget': apply_select2(forms.Select)}
    }


# Register your models here.
class BetriebAdmin(admin.ModelAdmin):
    list_display = ('name', 'manager', 'show_aufsichten', 'raum',
                    'arbeiter_effektiv', 'punkt',
                    'approved', 'beaufsichtigt')
    list_filter = ('confirmed', 'approved', 'raum')
    search_fields = ('name', 'manager', 'raum', 'aufsicht')
    formfield_overrides = {
        models.ManyToManyField: {'widget': forms.CheckboxSelectMultiple},
        models.ForeignKey: {'widget': apply_select2(forms.Select)}
    }
    actions = [ban_ip, create_overview, sum_umsatz]
    filter_horizontal = ('angestellte',)
    inlines = [BetriebsabrechnungInline, BetriebskreditInline, AufsichtInline]


class ParteiAdmin(admin.ModelAdmin):
    list_display = ('name', 'abbreviation', 'chef', 'description', 'confirmed',
                    'approved')
    list_filter = ('confirmed', 'approved')
    actions = [ban_ip]


class PresidentAdmin(admin.ModelAdmin):
    list_display = ('name', 'confirmed', 'approved')
    list_filter = ('confirmed', 'approved')
    actions = [ban_ip]


class QuestionAdmin(admin.ModelAdmin):
    list_display = ('subject', 'answered')
    list_filter = ('answered',)
    actions = [ban_ip]


class AngestellterAdmin(admin.ModelAdmin):
    list_display = ('name', 'klasse', 'is_teacher', 'show_betriebe', 'zugeteilt')
    list_filter = (ZugeteiltFilter,)
    search_fields = ('name', 'klasse')


class AufsichtAdmin(admin.ModelAdmin):
    list_display = ('name', 'show_stunden')
    search_fields = ('name',)
    formfield_overrides = {
        models.ManyToManyField: {'widget': forms.CheckboxSelectMultiple},
        models.ForeignKey: {'widget': apply_select2(forms.Select)}
    }

admin.site.register(Betrieb, BetriebAdmin)
admin.site.register(Partei, ParteiAdmin)
admin.site.register(PresidentCandidate, PresidentAdmin)
admin.site.register(Question, QuestionAdmin)
admin.site.register(Angestellter, AngestellterAdmin)
admin.site.register(Aufsicht, AufsichtAdmin)
