from turbogears import config
import cherrypy
from cherrypy.filters.basefilter import BaseFilter
from turbogears.startup import call_on_startup, call_on_shutdown
from wsmeext.tg1 import wsexpose, wsvalidate
import wsmeext.tg1

__all__ = ['adapt', 'wsexpose', 'wsvalidate']


class WSMECherrypyFilter(BaseFilter):
    def __init__(self, controller):
        self.controller = controller
        self.webpath = None

    def on_start_resource(self):
        path = cherrypy.request.path
        if path.startswith(self.controller._wsroot._webpath):
            cherrypy.request.processRequestBody = False


def adapt(wsroot):
    wsroot._scan_api = wsmeext.tg1.scan_api
    controller = wsmeext.tg1.Controller(wsroot)
    filter_ = WSMECherrypyFilter(controller)

    def install_filter():
        filter_.webpath = config.get('server.webpath') or ''
        controller._wsroot._webpath = \
            filter_.webpath + controller._wsroot._webpath
        cherrypy.root._cp_filters.append(filter_)

    def uninstall_filter():
        cherrypy.root._cp_filters.remove(filter_)
        controller._wsroot._webpath = \
            controller._wsroot._webpath[len(filter_.webpath):]

    call_on_startup.append(install_filter)
    call_on_shutdown.insert(0, uninstall_filter)
    return controller