from django import forms, http, template
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404, render_to_response
from django.http import HttpResponse, Http404, HttpResponseServerError

import os, commands

from models import *
from settings import *
from django.contrib.comments.models import Comment

# Create your views here.

def frontpage(request):
    t = fromslug('')
    t.update()
    #TODO: doesn't display free comments unless there's a comment
    lc = Comment.objects.filter(content_type__name="item").order_by('-submit_date')[:6]
    return render_to_response('git_wiki/frontpage.html', \
            dict(shortlog=shortlog(), tree=t,
                 latest_comments=lc,
                 newitems=newest_items()))

def tree(request, reqslug, tree=None):
    if not tree:
        t = fromslug(reqslug)
        if not t:
            raise Http404
        if t.type == 'blob':
            return item(request, reqslug, blob=t)
    else: 
        t = tree

    t.update()
    (heads,tags) = reposcan()
    return render_to_response('git_wiki/tree.html',
            dict(shortlog=shortlog(tree=t), tree=t,
                heads=heads,tags=tags))

def item(request, reqslug, blob=None):
    if not blob:
        i = fromslug(reqslug)
        if not i:
            raise Http404
        if i.type == 'tree':
            return tree(request, reqslug)
    else: 
        i = blob
    i.update()

    try:
        from docutils.core import publish_parts,Publisher
        import latex_directive
        latex_directive.dorawtexstuff = False
        latex_directive.register()
    except ImportError:
        if settings.DEBUG:
            raise HttpResponseServerError(request)
    else:
        docutils_settings = getattr(settings, "GITWIKI_REST_SETTINGS", {})
        parts = publish_parts(source=i.contents, writer_name="html4css1", settings_overrides=docutils_settings)
        return render_to_response('git_wiki/item.html',
                        dict(item=i,doc=parts,user=request.user))

def latexitem(request, reqslug, blob=None):
    if not blob:
        i = fromslug(reqslug)
        if not i:
            raise Http404
        if i.type == 'tree':
            return tree(request, reqslug)
    else: 
        i = blob
    i.update()

    try:
        from docutils.core import publish_parts,Publisher
        import latex_directive
        latex_directive.dorawtexstuff = True
        latex_directive.register()
    except ImportError:
        if settings.DEBUG:
            raise HttpResponseServerError(request)
    else:
        docutils_settings = getattr(settings, "GITWIKI_REST_SETTINGS", 
            {'format':'latex'})
        parts = publish_parts(source=i.contents, writer_name="latex", settings_overrides=docutils_settings)
        hr = HttpResponse(mimetype="text/plain")
        hr['Content-Disposition'] = 'filename=%s.tex' % reqslug
        hr.write(parts['whole'].replace('{\$}','$'))
        #hr.write(parts['whole'])
        return hr

def pdfitem(request, reqslug, blob=None):
    if not blob:
        i = fromslug(reqslug)
        if not i:
            raise Http404
        if i.type == 'tree':
            return tree(request, reqslug)
    else: 
        i = blob
    i.update()

    try:
        from docutils.core import publish_parts,Publisher
        import latex_directive
        latex_directive.dorawtexstuff = True
        latex_directive.register()
        import tempfile,re,os,shutil
    except ImportError:
        if settings.DEBUG:
            raise HttpResponseServerError(request)
    else:
        docutils_settings = getattr(settings, "GITWIKI_REST_SETTINGS", 
            {'format':'latex'})
        parts = publish_parts(source=i.contents, writer_name="latex", settings_overrides=docutils_settings)
        tmpdir = tempfile.mkdtemp()
        pre = i.slug().split('/')
        for fig in re.findall('\\includegraphics.*\{(.+)\}', parts['whole']):
            try:
                if len(pre) > 1:
                    fig_blob = fromslug("%s/%s" % ('/'.join(pre[:-1])),fig)
                else:
                    fig_blob = fromslug(fig)
                fig_blob.update()
                # if might have to create subdirectories for figures
                fig_pre = fig.split('/')
                if len(fig_pre) > 1:
                    os.mkdir("%s/%s" % (tmpdir,'/'.join(fig_pre[:-1])))
                fig_file = file(str("%s/%s" % (tmpdir,fig)),'wb')
                fig_file.write(fig_blob.contents)
                fig_file.close()
            except:
                parts['whole'].replace(fig,'')
        hr = HttpResponse(mimetype="application/pdf")
        #hr = HttpResponse()
        hr['Content-Disposition'] = 'filename=%s.pdf' % reqslug
        write_tex,pdf = os.popen2('rubber-pipe -qqq -d --into %s' % tmpdir)
        write_tex.write(parts['whole'].replace('{\$}','$'))
        write_tex.flush()
        write_tex.close()
        #hr.write(parts['whole'])
        #pdf.flush()
        for l in pdf.readlines():
            hr.write(l)
        try:
            pdff = open("%s/rubtmp0.pdf" % tmpdir,'r')
            for l in pdff.readlines():
                hr.write(l)
            pdff.close()
        except: 
            pass
        pdf.close()
        shutil.rmtree(tmpdir)
        return hr

def rawitem(request, reqslug, blob=None):
    if reqslug.endswith('/'):
        reqslug=reqslug[:-1]
    if not blob:
        i = fromslug(reqslug)
        if not i:
            raise Http404
        if i.type == 'tree':
            return tree(request, reqslug)
    else: 
        i = blob
    i.update()
    slug = i.slug()
    r = HttpResponse(mimetype="text/plain")
    r['Content-Disposition'] = 'filename=%s.txt' % reqslug
    r.write(i.contents)
    return r

def figure(request, reqslug, blob=None, download=False):
    if reqslug.endswith('/'):
        reqslug=reqslug[:-1]
    if not blob:
        i = fromslug(reqslug)
        if not i:
            l = reqslug.split('/')
            if l[-2] == 'fig':
                l = l[:-3] + l[-2:]
            else:
                l = l[:-2] + l[-1:]
            i = fromslug('/'.join(l))
            if not i:
                raise Http404
        if i.type == 'tree':
            return tree(request, reqslug)
    else: 
        i = blob
    mime = "image/image"
    slug = i.slug()
    i.update()
    if slug.endswith('.jpg') or slug.endswith('.jpeg'):
        mime = "image/jpeg"
    elif slug.endswith('.png'):
        mime = "image/jpeg"
    elif slug.endswith('.gif'):
        mime = "image/jpeg"
    elif slug.endswith('.svg'):
        mime = "image/svg+xml"
    r = HttpResponse(mimetype=mime)
    if download:
        r['Content-Disposition'] = 'attachment; filename=%s' % reqslug
    else:
        r['Content-Disposition'] = 'filename=%s' % reqslug
    f = i.getfile()
    t = f.readlines()
    r.write(i.contents)
    return r

def olditem(request, hash):
    i = get_object_or_404(Item, id=hash)
    i.update()
    return render_to_response('git_browse/olditem.html',
                      dict(item=i))

def view_commit(request, hash):
    (heads, tags) = reposcan()
    c = Commit(id=hash)
    c.update()
    try:
        from pygments import highlight
        from pygments.lexers import DiffLexer
        from pygments.formatters import HtmlFormatter
        c.pretty_diff = highlight(c.rawdiff, DiffLexer(), HtmlFormatter())
    except: pass

    return render_to_response('git_wiki/commit.html',
                      dict(heads=heads, tags=tags,
                      commit=c))