#!/usr/bin/python

from os import path, chdir
import sys

# Make sure PYTHONPATH is right
curdir = path.dirname(path.realpath(__file__))
chdir(curdir)
sys.path = [curdir+'/'] + sys.path
sys.path = [curdir+'/templates/'] + sys.path

from storage import storage_init, StorageFactory
from paste.request import parse_formvars
from paste.session import SessionMiddleware

import views

import rest_directive
import transaction

reserved_locations = {
    'browse' : views.BrowseView,
    'login': views.LogInView,
    'register': views.RegisterView,
    'newEntry': views.NewEntryView,
    'upload': views.UploadView,
    'pollManage': views.PollManageView,
    'polls': views.PollBrowseView,
    'feed.rss' : views.RSSEntryView,
    'blog.css' : views.CSSView,
    'blogsource.tar' : views.AllSourceView
    }    

class ObjectPublisher(object):
    def __init__(self):
        # XXX: This is "bad" for some reason...
        reload(sys)
        sys.setdefaultencoding('utf-8')

        # Make sure PYTHONPATH is right
        curdir = path.dirname(path.realpath(__file__))
        chdir(curdir)
        sys.path = [curdir+'/'] + sys.path
        sys.path = [curdir+'/templates/'] + sys.path

        # Make sure the database has at least *some* idea of wtf it is
        storage_init()

        # Initialize this thread's connection to the database
        self.storage = StorageFactory()

    def __call__(self, environ, start_response):
        fields = parse_formvars(environ)
        
        view = self.get_view(environ)

        response = view()
        
        # Commit any changes made
        transaction.commit()
        
        response_body = response.read()
        if 'text' in response.http_headers['Content-Type']:
            try:
                if not isinstance(response_body,unicode):
                    response_body = unicode(response_body, 'utf-8')
                response_body = response_body.encode('utf-8')
            except UnicodeError as e:
                response.http_status = "500 Server Error"
                response_body = "There was an error with Unicode encoding. "
                response_body +="Please try again, or notify the administrator."
                from sys import stderr
                stderr.write("Unicode error: " + str(e) + "\n")
                stderr.write("  Path info: " + environ.get('PATH_INFO')+"\n")
                start_response('500 Server Error', response.getHeaders())
                return ["Unicode Error. Please consult Logs"]
                
        start_response(response.http_status, response.getHeaders())

        return [response_body]

    def get_view(self, environ):
        pathinfo = environ.get('PATH_INFO','')
        splitpath = pathinfo.strip('/').split('/')
        page = splitpath[0]
        session = environ['paste.session.factory']()
        view = None
        if page in reserved_locations:
            view = reserved_locations[page](environ, session, splitpath, storage=self.storage)
        else:
            view = views.EntryView(environ, session, splitpath, storage=self.storage)
        return view

application = ObjectPublisher()
application = SessionMiddleware(application)

if __name__ == '__main__':
    from paste import httpserver
    httpserver.serve(application, host='0.0.0.0', port='8080',
                     use_threadpool=False, threadpool_workers=20)


