#!/usr/bin/python
from storage import storage_init, StorageFactory
from paste.request import parse_formvars
from paste.session import SessionMiddleware

from os import path, chdir
import sys
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']:
            if not isinstance(response_body,unicode):
                response_body = unicode(response_body, 'utf-8')
            response_body = response_body.encode('utf-8')
        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
        
if __name__ == '__main__':
    from paste import httpserver
    app = ObjectPublisher()
    app = SessionMiddleware(app)
    httpserver.serve(app, host='0.0.0.0', port='8080',
                     use_threadpool=True, threadpool_workers=20,
                     request_queue_size=100)
    
