from django.shortcuts import render, get_object_or_404
from django.contrib.auth.decorators import login_required
from django.template import RequestContext, loader, Context
from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.core.urlresolvers import reverse
from django.contrib import messages

from decorators import *
from functions import *

from units.models import *
from courses.models import *
from pages.models import *
from pages.forms import *

@superuser_only
def draggables(request, course_slug, unit_slug, page_slug):

    page      = get_object_or_404(Page, slug=page_slug)
    drag_drop = get_object_or_404(PageDragDrop, page=page)

    draggables = DragDropDraggable.objects.filter(drag_drop=drag_drop)
    
    return render(request, 'pages/admin/drag-drop/draggables.html', {'page': page, 'draggables': draggables})


@superuser_only
def draggables_add(request, course_slug, unit_slug, page_slug):

    page      = get_object_or_404(Page, slug=page_slug)
    drag_drop = get_object_or_404(PageDragDrop, page=page)

    draggable_form = DragDropDraggableForm()

    if request.POST and request.FILES:
        draggable_form = DragDropDraggableForm(request.POST, request.FILES)
        if draggable_form.is_valid():

            try:
                draggable = draggable_form.save(commit=False)
                draggable.drag_drop = drag_drop
                draggable.save()
                messages.success(request, "Draggable saved")
            except Exception:
                messages.error(request, "Draggable could not be saved")
            return HttpResponseRedirect(reverse('admin_drag_drop_draggables', args=[page.unit.course.slug, page.unit.slug, page.slug]))
    
    return render(request, 'pages/admin/drag-drop/draggables_add.html', {'page': page, 'draggable_form': draggable_form})


@superuser_only
def draggables_edit(request, course_slug, unit_slug, page_slug, id):

    page      = get_object_or_404(Page, slug=page_slug)
    drag_drop = get_object_or_404(PageDragDrop, page=page)
    draggable = get_object_or_404(DragDropDraggable, id=id)

    draggable_form = DragDropDraggableForm(instance=draggable)

    if request.POST:
        draggable_form = DragDropDraggableForm(request.POST, request.FILES, instance=draggable)
        if draggable_form.is_valid():

            try:
                draggable_form.save()
                messages.success(request, "Draggable saved")
            except Exception:
                messages.error(request, "Draggable could not be saved")
            return HttpResponseRedirect(reverse('admin_drag_drop_draggables', args=[page.unit.course.slug, page.unit.slug, page.slug]))
    
    return render(request, 'pages/admin/drag-drop/draggables_edit.html', {'page': page, 'draggable_form': draggable_form})


@superuser_only
def draggables_delete(request, course_slug, unit_slug, page_slug, id):

    page      = get_object_or_404(Page, slug=page_slug)
    drag_drop = get_object_or_404(PageDragDrop, page=page)
    draggable = get_object_or_404(DragDropDraggable, id=id)

    try:
        draggable.delete()
        messages.success(request, "Draggable deleted")
    except Exception:
        messages.error(request, "Draggable could not be deleted")

    return HttpResponseRedirect(reverse('admin_drag_drop_draggables', args=[page.unit.course.slug, page.unit.slug, page.slug]))
    
    

@superuser_only
def targets(request, course_slug, unit_slug, page_slug):

    page      = get_object_or_404(Page, slug=page_slug)
    drag_drop = get_object_or_404(PageDragDrop, page=page)

    targets = DragDropTarget.objects.filter(drag_drop=drag_drop)
    
    return render(request, 'pages/admin/drag-drop/targets.html', {'page': page, 'targets': targets})


@superuser_only
def targets_add(request, course_slug, unit_slug, page_slug):

    page      = get_object_or_404(Page, slug=page_slug)
    drag_drop = get_object_or_404(PageDragDrop, page=page)

    target_form = DragDropTargetForm()
    target_form.fields["draggable"].queryset = DragDropDraggable.objects.filter(drag_drop=drag_drop)

    if request.POST and request.FILES:
        target_form = DragDropTargetForm(request.POST, request.FILES)
        if target_form.is_valid():

            try:
                target = target_form.save(commit=False)
                target.drag_drop = drag_drop
                target.save()
                target_form.save_m2m()
                messages.success(request, "Target saved")
            except Exception:
                messages.error(request, "Target could not be saved")
            return HttpResponseRedirect(reverse('admin_drag_drop_targets', args=[page.unit.course.slug, page.unit.slug, page.slug]))
    
    return render(request, 'pages/admin/drag-drop/targets_add.html', {'page': page, 'target_form': target_form})


@superuser_only
def targets_edit(request, course_slug, unit_slug, page_slug, id):

    page      = get_object_or_404(Page, slug=page_slug)
    drag_drop = get_object_or_404(PageDragDrop, page=page)
    target    = get_object_or_404(DragDropTarget, id=id)

    target_form = DragDropTargetForm(instance=target)
    target_form.fields["draggable"].queryset = DragDropDraggable.objects.filter(drag_drop=drag_drop)

    if request.POST:
        target_form = DragDropTargetForm(request.POST, request.FILES, instance=target)
        if target_form.is_valid():

            try:
                target_form.save()
                messages.success(request, "Target saved")
            except Exception:
                messages.error(request, "Target could not be saved")
            return HttpResponseRedirect(reverse('admin_drag_drop_targets', args=[page.unit.course.slug, page.unit.slug, page.slug]))
    
    return render(request, 'pages/admin/drag-drop/targets_edit.html', {'page': page, 'target_form': target_form})


@superuser_only
def targets_delete(request, course_slug, unit_slug, page_slug, id):

    page      = get_object_or_404(Page, slug=page_slug)
    drag_drop = get_object_or_404(PageDragDrop, page=page)
    target    = get_object_or_404(DragDropTarget, id=id)

    try:
        target.delete()
        messages.success(request, "Target deleted")
    except Exception:
        messages.error(request, "Target could not be deleted")

    return HttpResponseRedirect(reverse('admin_drag_drop_targets', args=[page.unit.course.slug, page.unit.slug, page.slug]))
