from datetime import datetime

from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from django.http import Http404
from django.shortcuts import render, redirect, get_object_or_404
from django.template import loader

from .models import Mood, Activity, Tag
from .forms import MoodModelForm


def index(request):
    #   we need the entries per page from the user session, defaults to 10
    epp = request.session.get('epp', 10)

    # check if the user is logged in, if not redirect to login page
    if not request.user.is_authenticated:
        return redirect('login')

    mood_list = Mood.objects.filter(user=request.user.id).order_by('-moment')[:epp]
    template = loader.get_template('main/index.html')

    context = {
        'mood_list': mood_list,
    }
    return render(request, 'main/index.html', context)


def set_epp(request, epp):
    #   set the entries per page, store this in the user session
    request.session['epp'] = epp
    return redirect('index')


def detail(request, mood_id):
    try:
        mood = Mood.objects.get(pk=mood_id)
    except Mood.DoesNotExist:
        raise Http404("Moment existiert nicht!")
    return render(request, 'main/detail.html', {'mood': mood})


class TagCreate(CreateView):
    model = Tag
    fields = ['name', 'icon']
    success_url = reverse_lazy('tag_list')

    def form_valid(self, form):
        form.instance.user = self.request.user
        return super(TagCreate, self).form_valid(form)


class TagDelete(DeleteView):
    model = Tag
    success_url = reverse_lazy('tag_list')


class TagUpdate(UpdateView):
    model = Tag
    fields = ['name', 'icon']
    success_url = reverse_lazy('tag_list')


class ActivityCreate(CreateView):
    model = Activity
    fields = ['name', 'icon']
    success_url = reverse_lazy('activity_list')


class ActivityDelete(DeleteView):
    model = Activity
    success_url = reverse_lazy('activity_list')


class ActivityUpdate(UpdateView):
    model = Activity
    fields = ['name', 'icon']
    success_url = reverse_lazy('activity_list')


class MoodCreate(CreateView):
    model = Mood
    form_class = MoodModelForm
    initial = {'moment': datetime.now}

    def form_valid(self, form):
        user = self.request.user
        form.instance.user = user
        form.instance.mood = int(self.request.POST.get('mood'))
        return super(MoodCreate, self).form_valid(form)

    success_url = reverse_lazy('index')


class MoodUpdate(UpdateView):
    """ Update a mood entry  """
    model = Mood
    form_class = MoodModelForm
    # fields = ['moment', 'mood', 'activities', 'tags', 'comment']

    success_url = reverse_lazy('index')
    fa_mood_icons = ["fa-smile-beam", "fa-smile", "fa-meh", "fa-frown-open", "fa-frown"]


class MoodDelete(DeleteView):
    """ Delete a mood entry  """
    model = Mood
    success_url = reverse_lazy('index')


def copymood(request, mood_id):
    """
    Copy a mood entry.

    The user, comment and mood are copied, as well as tags and activities.

    The moment is set to the current time.
    :param request:
    :param mood_id: the id of the mood to be copied
    :return: redirects to the index view
    """
    mood = Mood.objects.get(pk=mood_id)
    new_mood = Mood()
    new_mood.user_id = mood.user_id
    new_mood.moment = datetime.now()
    new_mood.comment = mood.comment
    new_mood.mood = mood.mood
    new_mood.save()                     # need to save it first so we get an id and can use m2m attributes

    new_mood.tags.set(mood.tags.all())
    new_mood.activities.set(mood.activities.all())
    new_mood.save()

    return redirect('index')


def activitylist(request):
    activity_list = Activity.objects.all().order_by('name')

    context = {
        'activity_list': activity_list,
    }
    return render(request, 'main/activity_list.html', context)


def taglist(request):
    tag_list = Tag.objects.filter(user=request.user.id).order_by('name')

    context = {
        'tag_list': tag_list,
    }
    return render(request, 'main/tag_list.html', context)

