from django.shortcuts import get_object_or_404
from django.views.generic.simple import direct_to_template
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden
from django import forms
from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse

import random

from djangoratings.models import Vote
from tagging.models import TaggedItem
from mysite.itemrate.models import Presentation


@login_required
def index(request):
    presentation_list = Presentation.objects.all()
    return  direct_to_template(request, 'itemrate/index.html', {
            'presentation_list': presentation_list})

@login_required
def view(request, item_id):
    presentation = get_object_or_404(Presentation, pk=item_id)

    if request.user.username == presentation.username or\
            request.user.has_perm('itemrate.view_presentation'):
        can_view = True
    else:
        can_view = False

    return direct_to_template(request, 'itemrate/view.html', {
                'presentation': presentation,
                'can_view': can_view})

@login_required
def rate(request, item_id):
    item = get_object_or_404(Presentation, pk=item_id)
    if request.POST.get('delete', False):
        item.rating.delete(user=request.user,
                           ip_address=request.META['REMOTE_ADDR'])
        return HttpResponse("rating deleted.")
    elif request.POST.get('score', False):
        item.rating.add(score=int(request.POST['score']),
                        user=request.user,
                        ip_address=request.META['REMOTE_ADDR'])
        #return HttpResponse(item.rating.votes)
        #return HttpResponse(request.user)
        #return HttpResponse(item.rating.score)
        return HttpResponse("score %s, votes %s, score/votes %s" %
                        (item.rating.score, item.rating.votes,
                         float(item.rating.score)/item.rating.votes))
    else:
         return HttpResponse('wrong request')

class PresentationForm(forms.models.ModelForm):
    class Meta:
        model = Presentation
        exclude = ('rating', 'username')

def presentation_form(request):
    return {'presentation': PresentationForm}

@login_required
def add(request, item_id=None):
    '''Add/edit a submission.

    This method is used for both, adding and editing a submission. If
    item item_id isn't set a new submission gets added, resp. an empty
    form is shown.
    
    '''
    presentation = None
    if item_id:
        presentation = get_object_or_404(Presentation, pk=item_id)
        if request.user.username != presentation.username:
            return HttpResponseForbidden('<h1>You are not allowed to edit this submission.</h1>')


    if request.method == 'POST':
        form = PresentationForm(request.POST, instance=presentation)
        if form.is_valid():
            presentation = form.save(commit=False)
            presentation.username = request.user.username
            presentation.save()

            return HttpResponseRedirect(
                    reverse('view_item',kwargs={'item_id': presentation.pk}))
    else:
        form = PresentationForm(instance=presentation)

    return direct_to_template(request, "itemrate/item_edit.html",
                              {'form': form})

@login_required
def list_my(request):
    presentation_list = Presentation.objects.filter(
                            username=request.user.username)
    return  direct_to_template(request, 'itemrate/bullet_list.html', {
            'presentation_list': presentation_list})

@login_required
def list_all(request, tags=None):
    '''List all Abstracts in a random order.

    The random order is based on the username, this way we'll make sure
    that it's the same for a single user, but not the same for all
    users. This is important for the voting, else the the Abstracts at
    the top might get more votes than the one at the bottom.

    '''
    if tags is None:
        presentation_list = list(Presentation.objects.all())
    else:
        tags = tags.split('+')
        presentation_list = list(TaggedItem.objects.get_union_by_model(
                Presentation, tags))

    random.seed(request.user.username)
    random.shuffle(presentation_list)

    # add rating information if user alread rated this item
    for p in presentation_list:
        score = Vote.objects.filter(object_id=p.pk, user=request.user.pk)\
                            .values_list('score', flat=True)
        if score:
            p.score = score[0]

    return direct_to_template(request, 'itemrate/list.html', {
            'presentation_list': presentation_list})
