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

    unit = get_object_or_404(Unit, slug=unit_slug, course__slug=course_slug) 

    panoramas = Panorama.objects.all()

    return render(request, 'pages/admin/panoramas/index.html', {'unit': unit, 'panoramas': panoramas})


@superuser_only
def add(request, course_slug, unit_slug):

    unit = get_object_or_404(Unit, slug=unit_slug, course__slug=course_slug) 

    panorama_form = PanoramaForm()

    if request.POST:
        panorama_form = PanoramaForm(request.POST, request.FILES)
        if panorama_form.is_valid():
            try:
                panorama_form.save()
                messages.success(request, "Panorama added successfully")
            except Exception:
                messages.error(request, "Could not save Panorama")
            return HttpResponseRedirect(reverse('admin_panoramas', args=[unit.course.slug, unit.slug]))

    return render(request, 'pages/admin/panoramas/add.html', {'unit': unit, 'panorama_form': panorama_form})


@superuser_only
def edit(request, course_slug, unit_slug, id):

    unit = get_object_or_404(Unit, slug=unit_slug, course__slug=course_slug) 

    panorama = get_object_or_404(Panorama, id=id)

    panorama_form = PanoramaForm(instance=panorama)

    if request.POST:
        panorama_form = PanoramaForm(request.POST, request.FILES, instance=panorama)
        if panorama_form.is_valid():
            try:
                panorama_form.save()
                messages.success(request, "Panorama saved successfully")
            except Exception:
                messages.error(request, "Could not save Panorama")
            return HttpResponseRedirect(reverse('admin_panoramas', args=[unit.course.slug, unit.slug]))

    return render(request, 'pages/admin/panoramas/edit.html', {'unit': unit, 'panorama_form': panorama_form})


@superuser_only
def delete(request, course_slug, unit_slug, id):

    unit = get_object_or_404(Unit, slug=unit_slug, course__slug=course_slug) 

    panorama = get_object_or_404(Panorama, id=id)

    try:
        panorama.delete()
        messages.success(request, "Panorama deleted")
    except Exception:
        messages.error(request, "Could not delete Panorama")
    return HttpResponseRedirect(reverse('admin_panoramas', args=[unit.course.slug, unit.slug]))


@superuser_only
def hotspots(request, course_slug, unit_slug, id):

    unit = get_object_or_404(Unit, slug=unit_slug, course__slug=course_slug) 

    panorama = get_object_or_404(Panorama, id=id)
    hotspots = Hotspot.objects.filter(pano=panorama)

    return render(request, 'pages/admin/panoramas/hotspots/index.html', {'unit': unit, 'hotspots': hotspots, 'panorama': panorama})


@superuser_only
def hotspots_add(request, course_slug, unit_slug, id):

    unit     = get_object_or_404(Unit, slug=unit_slug, course__slug=course_slug) 
    panorama = get_object_or_404(Panorama, id=id)

    hotspot_form = HotspotForm()

    if request.POST:
        hotspot_form = HotspotForm(request.POST)
        
        if hotspot_form.is_valid():

            try:
                hotspot      = hotspot_form.save(commit=False)
                hotspot.pano = panorama 
                hotspot.save()
                messages.success(request, "Hotspot saved")
            except Exception:
                messages.error(request, "Could not save Hotspot")
            return HttpResponseRedirect(reverse('admin_panoramas_hotspots', args=[course_slug, unit_slug, id]))   
    return render(request, 'pages/admin/panoramas/hotspots/add.html', {'panorama': panorama, 'hotspot_form': hotspot_form, 'unit': unit})


@superuser_only
def hotspots_edit(request, course_slug, unit_slug, id, hotspot_id):
    
    unit     = get_object_or_404(Unit, slug=unit_slug, course__slug=course_slug) 
    panorama = get_object_or_404(Panorama, id=id)

    hotspot = get_object_or_404(Hotspot, pano=panorama, id=hotspot_id)

    hotspot_form = HotspotForm(instance=hotspot)
    
    if request.POST:
        hotspot_form = HotspotForm(request.POST, instance=hotspot)
        
        if hotspot_form.is_valid():

            try:
                hotspot_form.save()
                messages.success(request, "Hotspot saved")
            except Exception:
                messages.error(request, "Could not save Hotspot")
            return HttpResponseRedirect(reverse('admin_panoramas_hotspots', args=[course_slug, unit_slug, id]))   
    return render(request, 'pages/admin/panoramas/hotspots/edit.html', {'unit': unit, 'panorama': panorama, 'hotspot_form': hotspot_form})


@superuser_only
def hotspots_delete(request, course_slug, unit_slug, id, hotspot_id):
    
    unit     = get_object_or_404(Unit, slug=unit_slug, course__slug=course_slug) 
    panorama = get_object_or_404(Panorama, id=id)

    hotspot = get_object_or_404(Hotspot, pano=panorama, id=hotspot_id)

    try:
        hotspot.delete()
        messages.success(request, "Hotspot deleted")
    except Exception:
        messages.error(request, "Could not delete Hotspot")
    return HttpResponseRedirect(reverse('admin_panoramas_hotspots', args=[course_slug, unit_slug, id]))   
