from datetime import datetime

from django.db.models import Count
from django.forms import modelform_factory
from django.urls import reverse_lazy
from django.views.generic import CreateView, FormView

from tapperssleutel.forms import DateInput, DetailForm
from tapperssleutel.models import Tapper, Kwijtgeraakt


def dictcopy(old_dict):
    new_dict = {}
    for key, value in old_dict.items():
        new_dict[key] = value
    return new_dict


class HomePage(CreateView):
    model = Kwijtgeraakt
    template_name = "home.html"
    success_url = reverse_lazy('home')
    form_class = modelform_factory(Kwijtgeraakt,
                                   widgets={"date": DateInput},
                                   fields=('tapper', 'date'))

    def get_context_data(self, **kwargs):
        context = super(HomePage, self).get_context_data(**kwargs)
        context['tappers'] = list(Tapper.objects.all().annotate(amount=Count('kwijtgeraakt')).order_by('-amount'))

        context['detailform'] = DetailForm()

        dates = Kwijtgeraakt.objects.all().order_by('date')
        context['tapperlist'] = [x.name for x in Tapper.objects.all()]
        context['datelist'] = [x.date.strftime("%Y-%m-%d") for x in dates]
        context['tappersdata'] = {}
        current_counts = {tapper.name: 0 for tapper in Tapper.objects.all()}
        for date in dates:
            current_counts[date.tapper.name] += 1
            context['tappersdata'][date.date.strftime("%Y-%m-%d")] = dictcopy(current_counts)

        # Remove tappers with zero incidents
        zero_incidents = []
        for tapper, count in current_counts.items():
            if count == 0:
                zero_incidents.append(tapper)
                for date, entry in context['tappersdata'].items():
                    del entry[tapper]
                context['tapperlist'].remove(tapper)
        context['tappers'] = [x for x in context['tappers'] if x.name not in zero_incidents]

        return context

class DetailPage(FormView):
    form_class = DetailForm
    template_name = "detail.html"

    def get_context_data(self, form, **kwargs):
        context = super(DetailPage, self).get_context_data(form=form, **kwargs)
        context['tappers'] = Tapper.objects.all().annotate(amount=Count('kwijtgeraakt'))

        context['detailform'] = form
        context['start_date'] = form.cleaned_data['start_date']
        context['end_date'] = form.cleaned_data['end_date']

        dates = Kwijtgeraakt.objects.filter(date__gte=form.cleaned_data['start_date'], date__lte=form.cleaned_data['end_date']).order_by('date')
        context['tapperlist'] = [x.name for x in Tapper.objects.all()]
        context['datelist'] = [x.date.strftime("%Y-%m-%d") for x in dates]
        context['tappersdata'] = {}
        current_counts = {tapper.name: 0 for tapper in Tapper.objects.all()}
        for date in dates:
            current_counts[date.tapper.name] += 1
            context['tappersdata'][date.date.strftime("%Y-%m-%d")] = dictcopy(current_counts)

        # Remove tappers with zero incidents
        zero_incidents = []
        for tapper, count in current_counts.items():
            if count == 0:
                zero_incidents.append(tapper)
                for date, entry in context['tappersdata'].items():
                    del entry[tapper]
                context['tapperlist'].remove(tapper)
        context['tappers'] = [x for x in context['tappers'] if x.name not in zero_incidents]

        return context

    def form_valid(self, form):
        return self.render_to_response(self.get_context_data(form=form))


class NewTapperPage(CreateView):
    model = Tapper
    fields = ('name', )
    template_name = "tapper_form.html"
    success_url = reverse_lazy('home')