#! /usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright (C) 2010 Wikkid Developers.
#
# This software is licensed under the GNU Affero General Public License
# version 3 (see the file LICENSE).

"""The server class for the wiki."""

try:
    import _wikkid_path
except ImportError:
    # Not running from a branch.
    pass

import logging
import optparse
import sys

from bzrlib.workingtree import WorkingTree

from wikkid import version
from wikkid.app import WikkidApp
from wikkid.context import (
    DEFAULT_FORMAT,
    DEFAULT_HOST,
    DEFAULT_PORT,
    ExecutionContext,
    )
from wikkid.filestore.bzr import FileStore
from wikkid.user.bzr import LocalBazaarUserMiddleware


def setup_logging():
    """Set up a logger sending to stderr."""
    handler = logging.StreamHandler(strm=sys.stderr)
    fmt = '%(asctime)s %(levelname)-7s %(message)s'
    formatter = logging.Formatter(
        fmt=fmt, datefmt="%Y-%m-%d %H:%M:%S")
    handler.setFormatter(formatter)
    root = logging.getLogger()
    root.addHandler(handler)


def main(args):

    usage = "Usage: %prog [options] <wiki-branch>"
    parser = optparse.OptionParser(
        usage=usage, description="Run a Wikkid Wiki server.", version=version)
    parser.add_option(
        '--host', type='string', default=DEFAULT_HOST,
        help=('The interface to listen on. Defaults to %r' % DEFAULT_HOST))
    parser.add_option(
        '--port', type='int', default=DEFAULT_PORT,
        help=('The port to listen on.  Defaults to %s.' % DEFAULT_PORT))
    parser.add_option(
        '--default-format', type='string', default=DEFAULT_FORMAT,
        help=("Specify the default wiki format to use. Defaults to %r"
              % DEFAULT_FORMAT))
    options, args = parser.parse_args(sys.argv[1:])

    execution_context = ExecutionContext(
        host=options.host,
        port=options.port,
        default_format=options.default_format)

    if len(args) == 0:
        print "No branch location specified.\n"
        parser.print_usage()
        sys.exit(1)
    if len(args) > 1:
        print "Unexpected positional args:", args[1:], "\n"
        parser.print_usage()
        sys.exit(1)
    branch = args[0]
    setup_logging()
    logger = logging.getLogger('wikkid')
    logger.setLevel(logging.INFO)

    working_tree = WorkingTree.open(branch)
    logger.info('Using: %s', working_tree)
    filestore = FileStore(working_tree)

    app = WikkidApp(filestore=filestore, execution_context=execution_context)
    app = LocalBazaarUserMiddleware(app, working_tree.branch)
    from wsgiref.simple_server import make_server
    httpd = make_server(options.host, options.port, app)
    logger.info('Serving on http://%s:%s', options.host, options.port)
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        logger.info('Done.')


if __name__ == "__main__":
    main(sys.argv)
