"""Tornado handlers for the live notebook view.

Authors:

* Brian Granger
"""

#-----------------------------------------------------------------------------
#  Copyright (C) 2011  The IPython Development Team
#
#  Distributed under the terms of the BSD License.  The full license is in
#  the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------

from tornado import web
HTTPError = web.HTTPError

from ..base.handlers import IPythonHandler
from ..services.notebooks.handlers import _notebook_path_regex, _path_regex
from ..utils import url_path_join, url_escape

#-----------------------------------------------------------------------------
# Handlers
#-----------------------------------------------------------------------------


class NotebookHandler(IPythonHandler):

    @web.authenticated
    def get(self, path='', name=None):
        """get renders the notebook template if a name is given, or 
        redirects to the '/files/' handler if the name is not given."""
        path = path.strip('/')
        nbm = self.notebook_manager
        if name is None:
            raise web.HTTPError(500, "This shouldn't be accessible: %s" % self.request.uri)
        
        # a .ipynb filename was given
        if not nbm.notebook_exists(name, path):
            raise web.HTTPError(404, u'Notebook does not exist: %s/%s' % (path, name))
        name = url_escape(name)
        path = url_escape(path)
        self.write(self.render_template('notebook.html',
            project=self.project_dir,
            notebook_path=path,
            notebook_name=name,
            kill_kernel=False,
            mathjax_url=self.mathjax_url,
            )
        )

class NotebookRedirectHandler(IPythonHandler):
    def get(self, path=''):
        nbm = self.notebook_manager
        if nbm.path_exists(path):
            # it's a *directory*, redirect to /tree
            url = url_path_join(self.base_project_url, 'tree', path)
        else:
            # otherwise, redirect to /files
            # TODO: This should check if it's actually a file
            url = url_path_join(self.base_project_url, 'files', path)
        url = url_escape(url)
        self.log.debug("Redirecting %s to %s", self.request.path, url)
        self.redirect(url)

#-----------------------------------------------------------------------------
# URL to handler mappings
#-----------------------------------------------------------------------------


default_handlers = [
    (r"/notebooks%s" % _notebook_path_regex, NotebookHandler),
    (r"/notebooks%s" % _path_regex, NotebookRedirectHandler),
]


@@ -589,16 +589,26 @@
 ------%0A%0A
+import os%0A
 from tor
@@ -2257,57 +2257,624 @@
     
-# TODO: T
+if '/files/' in path:%0A                # redirect without files/ iff it would 404%0A                # this preserves pre-2.0-style 'files/' links%0A                # FIXME: t
 his 
-should check if it's actually a file
+is hardcoded based on notebook_path,%0A                # but so is the files handler itself,%0A                # so it should work until both are cleaned up.%0A                parts = path.split('/')%0A                files_path = os.path.join(nbm.notebook_dir, *parts)%0A                self.log.warn(%22filespath: %25s%22, files_path)%0A                if not os.path.exists(files_path):%0A                    path = path.replace('/files/', '/', 1)%0A            
 %0A   

support 1.0-style `files/` relative URLs