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 columns(request, course_slug, unit_slug, page_slug):

    page              = get_object_or_404(Page, slug=page_slug)
    drag_drop_columns = get_object_or_404(PageDragDropColumns, page=page)

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


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

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

    column_form = PageDragDropColumnForm()

    if request.POST:
        column_form = PageDragDropColumnForm(request.POST)
        if column_form.is_valid():

            try:
                column = column_form.save(commit=False)
                column.drag_drop = drag_drop
                column.save()
                messages.success(request, "Column saved")
            except Exception:
                messages.error(request, "Column could not be saved")
            return HttpResponseRedirect(reverse('admin_drag_drop_columns', args=[page.unit.course.slug, page.unit.slug, page.slug]))
    
    return render(request, 'pages/admin/drag-drop-columns/columns_add.html', {'page': page, 'column_form': column_form})


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

    page      = get_object_or_404(Page, slug=page_slug)
    drag_drop = get_object_or_404(PageDragDropColumns, page=page)
    column    = get_object_or_404(PageDragDropColumn, id=id)

    column_form = PageDragDropColumnForm(instance=column)

    if request.POST:
        column_form = PageDragDropColumnForm(request.POST, request.FILES, instance=column)
        if column_form.is_valid():

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


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

    page      = get_object_or_404(Page, slug=page_slug)
    drag_drop = get_object_or_404(PageDragDropColumns, page=page)
    column    = get_object_or_404(PageDragDropColumn, id=id)

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

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


@superuser_only
def draggables(request, course_slug, unit_slug, page_slug, id):
    
    page      = get_object_or_404(Page, slug=page_slug)
    drag_drop = get_object_or_404(PageDragDropColumns, page=page)
    column    = get_object_or_404(PageDragDropColumn, id=id)

    draggables = column.get_draggables()
    
    return render(request, 'pages/admin/drag-drop-columns/draggables.html', {'page': page, 'draggables': draggables, 'column': column})



@superuser_only
def draggables_add(request, course_slug, unit_slug, page_slug, id):
    
    page      = get_object_or_404(Page, slug=page_slug)
    drag_drop = get_object_or_404(PageDragDropColumns, page=page)
    column    = get_object_or_404(PageDragDropColumn, id=id)

    draggable_form = PageDragDropColumnDraggableForm()

    if request.POST:
        draggable_form = PageDragDropColumnDraggableForm(request.POST)
        
        if draggable_form.is_valid():
            try:
                draggable = draggable_form.save(commit=False)
                draggable.column = column
                draggable.save()
                messages.success(request, "Draggable saved")
            except Exception:
                messages.error(request, "Draggable could not be saved")

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

    return render(request, 'pages/admin/drag-drop-columns/draggables_add.html', {'page': page, 'column': column, 'draggable_form': draggable_form})



@superuser_only
def draggables_edit(request, course_slug, unit_slug, page_slug, id, draggable_id):
    
    page      = get_object_or_404(Page, slug=page_slug)
    drag_drop = get_object_or_404(PageDragDropColumns, page=page)
    column    = get_object_or_404(PageDragDropColumn, id=id)

    draggable = get_object_or_404(PageDragDropColumnDraggable, id=draggable_id)

    draggable_form = PageDragDropColumnDraggableForm(instance=draggable)

    if request.POST:
        draggable_form = PageDragDropColumnDraggableForm(request.POST, 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_columns_draggables', args=[page.unit.course.slug, page.unit.slug, page.slug, column.id]))                

    return render(request, 'pages/admin/drag-drop-columns/draggables_edit.html', {'page': page, 'column': column, 'draggable_form': draggable_form})



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

    page      = get_object_or_404(Page, slug=page_slug)
    drag_drop = get_object_or_404(PageDragDropColumns, page=page)
    column    = get_object_or_404(PageDragDropColumn, id=id)

    draggable = get_object_or_404(PageDragDropColumnDraggable, id=draggable_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_columns_draggables', args=[page.unit.course.slug, page.unit.slug, page.slug, column.id]))                


# EVALUATE #

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

    page              = get_object_or_404(Page, slug=page_slug)
    drag_drop_columns = get_object_or_404(PageDragDropColumnsEvaluate, page=page)

    columns = PageDragDropColumnEvaluate.objects.filter(drag_drop=drag_drop_columns)
    
    return render(request, 'pages/admin/drag-drop-columns/columns_evaluate.html', {'page': page, 'columns': columns})


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

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

    column_form = PageDragDropColumnEvaluateForm()

    if request.POST:
        column_form = PageDragDropColumnEvaluateForm(request.POST)
        if column_form.is_valid():

            try:
                column = column_form.save(commit=False)
                column.drag_drop = drag_drop
                column.save()
                messages.success(request, "Column saved")
            except Exception:
                messages.error(request, "Column could not be saved")
            return HttpResponseRedirect(reverse('admin_drag_drop_columns_evaluate', args=[page.unit.course.slug, page.unit.slug, page.slug]))
    
    return render(request, 'pages/admin/drag-drop-columns/columns_evaluate_add.html', {'page': page, 'column_form': column_form})


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

    page      = get_object_or_404(Page, slug=page_slug)
    drag_drop = get_object_or_404(PageDragDropColumnsEvaluate, page=page)
    column    = get_object_or_404(PageDragDropColumnEvaluate, id=id)

    column_form = PageDragDropColumnEvaluateForm(instance=column)

    if request.POST:
        column_form = PageDragDropColumnEvaluateForm(request.POST, request.FILES, instance=column)
        if column_form.is_valid():

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


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

    page      = get_object_or_404(Page, slug=page_slug)
    drag_drop = get_object_or_404(PageDragDropColumns, page=page)
    column    = get_object_or_404(PageDragDropColumn, id=id)

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

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


@superuser_only
def draggables_evaluate(request, course_slug, unit_slug, page_slug):
    
    page      = get_object_or_404(Page, slug=page_slug)
    drag_drop = get_object_or_404(PageDragDropColumnsEvaluate, page=page)

    draggables = drag_drop.get_draggables()
    
    return render(request, 'pages/admin/drag-drop-columns/draggables_evaluate.html', {'page': page, 'draggables': draggables})



@superuser_only
def draggables_evaluate_add(request, course_slug, unit_slug, page_slug):
    
    page      = get_object_or_404(Page, slug=page_slug)
    drag_drop = get_object_or_404(PageDragDropColumnsEvaluate, page=page)

    draggable_form = PageDragDropColumnEvaluateDraggableForm()

    if request.POST:
        draggable_form = PageDragDropColumnEvaluateDraggableForm(request.POST)
        
        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, e:
                messages.error(request, "Draggable could not be saved %s " % e)

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

    return render(request, 'pages/admin/drag-drop-columns/draggables_evaluate_add.html', {'page': page, 'draggable_form': draggable_form})



@superuser_only
def draggables_evaluate_edit(request, course_slug, unit_slug, page_slug, draggable_id):
    
    page      = get_object_or_404(Page, slug=page_slug)
    drag_drop = get_object_or_404(PageDragDropColumnsEvaluate, page=page)

    draggable = get_object_or_404(PageDragDropColumnEvaluateDraggable, id=draggable_id)

    draggable_form = PageDragDropColumnEvaluateDraggableForm(instance=draggable)

    if request.POST:
        draggable_form = PageDragDropColumnEvaluateDraggableForm(request.POST, 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_columns_draggables_evaluate', args=[page.unit.course.slug, page.unit.slug, page.slug]))                

    return render(request, 'pages/admin/drag-drop-columns/draggables_evaluate_edit.html', {'page': page, 'draggable_form': draggable_form})



@superuser_only
def draggables_evaluate_delete(request, course_slug, unit_slug, page_slug, draggable_id):

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

    draggable = get_object_or_404(PageDragDropColumnEvaluateDraggable, id=draggable_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_columns_draggables_evaluate', args=[page.unit.course.slug, page.unit.slug, page.slug]))
