import cgi
import operator
import os
import wsgiref.handlers

from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template

from conf import FORMATTERS, LANGUAGES
from model import Pasting

from pygments import formatters
from pygments import highlight
from pygments.lexers import get_lexer_by_name


DEBUG = True


class BaseRequestHandler(webapp.RequestHandler):
    def render(self, template_name, context=None):
        """ Helper to render Django templates """
        context = context or dict()
        path = os.path.join(
            os.path.dirname(__file__), os.path.join("templates", template_name))
        self.response.out.write(template.render(path, context, debug=DEBUG))


class HomePage(BaseRequestHandler):
    def get(self):
        # check if the user is logged in
        user = users.get_current_user()
        if user:
            logout_url = users.create_logout_url(self.request.uri)
        else:
            login_url = users.create_login_url(self.request.uri)
        
        languages = sorted(LANGUAGES.items(), key=operator.itemgetter(0))
        self.render("index.html", locals())
        
    def post(self):
        # get the fields' values
        content = self.request.get('content')
        if not content: # content is required
            self.redirect('/')
            return

        user = users.get_current_user()
        author = user.nickname() if user else 'anonymous'
        
        syntax = self.request.get('syntax', default_value='text')
        
        # save and redirect
        pasting = Pasting(content=content, author=author, syntax=syntax)
        pasting.put()
        
        self.redirect('/%s' % pasting.key().id())


class PastingPage(BaseRequestHandler):
    def get(self, pasting_id, format=''):
        user = users.get_current_user()
        if user:
            logout_url = users.create_logout_url(self.request.uri)
        else:
            login_url = users.create_login_url(self.request.uri)

        try:
            pasting = Pasting.get_by_id(int(pasting_id))
            if not pasting:
                self.error(404)
                return
        except ValueError:
            self.error(404)
            return
            
        # pygmentize
        formatter = formatters.get_formatter_by_name(
            format or 'html', linenos=not format)
        lexer = get_lexer_by_name(pasting.syntax, stripall=True)
        pasting_body = highlight(pasting.content, lexer, formatter)
        
        if not format:
            syntax_description = LANGUAGES.get(pasting.syntax, 'text')
            formats = FORMATTERS
            self.render("pasting.html", locals())
        elif format in FORMATTERS:
            self.response.headers['Content-Type'] = 'text/plain; charset=utf-8'
            self.response.out.write(pasting_body)
            
class AboutPage(BaseRequestHandler):
    def get(self):
        self.render("about.html")
        
def main():
    application = webapp.WSGIApplication(
        [('/', HomePage),
        ('/about', AboutPage),
        ('/(\d+)[.]?(.*)', PastingPage)], debug=True)
    wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
    main()
