from django.views.generic import CreateView, DeleteView, ListView
from django.http import HttpResponse
from django.contrib import messages
from django.urls import reverse
from django.core.mail import send_mail
from django.conf import settings

from braces.views import LoginRequiredMixin
from crispy_forms.helper import FormHelper

from .models import UploadedScript, EventPage


class ScriptUploadView(CreateView):
    model = UploadedScript
    fields = ['name', 'script']

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        helper = FormHelper()
        helper.form_tag = False
        context['form'].helper = helper

        if self.request.user.is_authenticated:
            context['scripts'] = UploadedScript.objects.all()

        return context

    def form_valid(self, form):
        out = super().form_valid(form)
        messages.add_message(self.request, messages.SUCCESS, 'Skript erfolgreich hochgeladen. Vielen Dank!')
        send_mail(
            'Neuer Skript-Upload',
            '''Ein neues Skript wurde hochgeladen.
            Name: {}
            Datei: {}

            Download hier: {}'''.format(
                self.object.name, self.object.script.name, self.request.build_absolute_uri(reverse('script_upload'))),
            settings.DEFAULT_FROM_EMAIL,
            ['info@feogmbh.de'], fail_silently=True)
        return out

    def get_success_url(self):
        return reverse('script_upload')


class ScriptUploadDeleteView(LoginRequiredMixin, DeleteView):
    model = UploadedScript

    def get_success_url(self):
        return reverse('script_upload')


class ICSEventsView(ListView):
    def get_queryset(self):
        return EventPage.objects.live().filter(show_in_event_calendar=True)

    def render_to_response(self, context, **response_kwargs):
        from .utils import generate_events_ics
        return HttpResponse(generate_events_ics(self.get_queryset()), content_type='text/calendar')