from django.shortcuts import render_to_response
from django.template import RequestContext
from django.http import HttpResponse, HttpResponseRedirect, \
        Http404, HttpResponseNotModified
from django.contrib import messages
from django.db.models import Count

from voice import settings
from voice.models import Feature
from voice.forms import VoteForm, FeatureForm 

def index(request):
    feature_id = None
    form = VoteForm()

    sort, features = features_by_sort(request.GET.get('sort', None))

    grouped = []
    group = []
    for i, feature in enumerate(features):
        group.append(feature)
        if (i + 1) % 4 == 0:
            grouped.append(group)
            group = []
    if len(group) > 0:
        grouped.append(group)

    context = RequestContext(request, {
        'grouped_features': grouped,
        'form': form,
        'feature_id': feature_id,
        'request': request,
        'sort': sort,
        })

    return render_to_response('voice/index.html', context)

def feature(request, feature_id):
    feature = Feature.objects.get(id=feature_id)

    if request.method == 'POST':
        form = VoteForm(request.POST)
        if form.is_valid():
            vote = form.save(commit=False)
            vote.feature = feature
            vote.save()
            messages.success(request, 'Vote successfully submitted!')
    else:
        form = VoteForm()

    context = RequestContext(request, {
        'form': form,
        'request': request,
        'feature': feature,
        })

    return render_to_response('voice/feature.html', context)

def new_feature(request):
    if request.method == 'POST':
        form = FeatureForm(request.POST)
        if form.is_valid():
            feature = form.save(commit=False)
            feature.votes_needed = settings.DEFAULT_VOTES_NEEDED
            feature.save()
            messages.success(request, 'Thanks for requesting a feature!')
            form = FeatureForm()
    else:
        form = FeatureForm()

    context = RequestContext(request, {
        'form': form,
        })
    return render_to_response('voice/new_feature.html', context)

def admin(request):
    sort, features = features_by_sort(request.GET.get('sort', None))
    return render_to_response('voice/admin/index.html', {
        'request': request,
        'features': features,
        'sort': sort,
        })

def features_by_sort(sort):
    if sort == 'newest':
        features = Feature.objects.filter(state='V').order_by('-created')
    elif sort == 'in-progress':
        features = Feature.objects.filter(state='W')
    elif sort == 'finished':
        features = Feature.objects.filter(state='F')
    else:
        sort = 'popular'
        features = Feature.objects.filter(state='V').annotate(
                Count('votes')).order_by('-votes__count')
    return (sort, features)


def static_media(request, path):
    """
    Taken from django-sentry:
    http://github.com/dcramer/django-sentry

    Serve static files below a given point in the directory structure.
    """
    from django.utils.http import http_date
    from django.views.static import was_modified_since
    import mimetypes
    import os.path
    import posixpath
    import stat
    import urllib

    document_root = os.path.join(settings.ROOT, 'static')
    print document_root

    path = posixpath.normpath(urllib.unquote(path))
    path = path.lstrip('/')
    newpath = ''
    for part in path.split('/'):
        if not part:
            # Strip empty path components.
            continue
        drive, part = os.path.splitdrive(part)
        head, part = os.path.split(part)
        if part in (os.curdir, os.pardir):
            # Strip '.' and '..' in path.
            continue
        newpath = os.path.join(newpath, part).replace('\\', '/')
    if newpath and path != newpath:
        return HttpResponseRedirect(newpath)
    fullpath = os.path.join(document_root, newpath)
    if os.path.isdir(fullpath):
        raise Http404("Directory indexes are not allowed here.")
    if not os.path.exists(fullpath):
        raise Http404('"%s" does not exist' % fullpath)
    # Respect the If-Modified-Since header.
    statobj = os.stat(fullpath)
    mimetype = mimetypes.guess_type(fullpath)[0] or 'application/octet-stream'
    if not was_modified_since(request.META.get('HTTP_IF_MODIFIED_SINCE'),
                              statobj[stat.ST_MTIME], statobj[stat.ST_SIZE]):
        return HttpResponseNotModified(mimetype=mimetype)
    contents = open(fullpath, 'rb').read()
    response = HttpResponse(contents, mimetype=mimetype)
    response["Last-Modified"] = http_date(statobj[stat.ST_MTIME])
    response["Content-Length"] = len(contents)
    return response