#!/usr/bin/env python

"""
TiddlyWebWiki dev instantiation
"""

import sys
import os

import tiddlywebplugins.devstore as devstore

from tiddlyweb.util import std_error_message
from tiddlywebplugins.instancer.util import spawn


VIRTUAL_NAMESPACE = 'tiddlywebplugins'
INSTANCE_CONFIG_HEAD = """
import sys

sys.path.insert(0, '%s')
sys.modules['%s'].__dict__['__path__'].insert(0, '%s')
"""


sys.path.insert(0, '.')


def main(args):
    args = [unicode(arg, 'utf-8') for arg in args]

    try:
        package_name = args[1]
    except IndexError:
        std_error_message('ERROR: missing package name parameter')
        return False
    try:
        import mangler
        local_package = os.path.abspath('.')
        namespace_path = os.path.join('.', VIRTUAL_NAMESPACE)
        namespace_path = os.path.abspath(namespace_path)
    except ImportError:
        local_package = False
    instance_module = __import__('%s.instance' % package_name, None, None,
        [package_name])
    init_config = __import__('%s.config' % package_name, None, None,
        ['config']).config
    if local_package:
        init_config['instance_config_head'] = INSTANCE_CONFIG_HEAD % (
            local_package, VIRTUAL_NAMESPACE, namespace_path)

    try:
        instance_path = args[2]
    except IndexError:
        std_error_message('ERROR: missing instance directory parameter')
        return False

    instance_tiddlers = init_config['instance_tiddlers']
    for pair in args[3:]:
        bag, filepath = pair.split(':', 1)
        filepath = os.path.abspath(filepath)

        # XXX: _pretty_print doesn't handle Unicode strings properly
        bag = bag.encode('utf-8')
        filepath = filepath.encode('utf-8')

        std_error_message('adding %s to %s' % (filepath, bag))
        try:
            instance_tiddlers[bag].append(filepath)
        except KeyError:
            instance_tiddlers[bag] = [filepath]

    server_store = ['tiddlywebplugins.devstore', { 'store_root': 'store' }]
    init_config['server_store'] = server_store
    custom_config = {
        'server_store': server_store,
        'local_instance_tiddlers': instance_tiddlers,
        'log_level': 'DEBUG'
    }
    instance_module.instance_config.update(custom_config)

    # prevent local tiddlers from being created in the devstore
    devstore.Store.tiddler_put = lambda self, tiddler: None

    spawn(instance_path, init_config, instance_module)
    return True


if __name__ == '__main__':
    status = not main(sys.argv)
    sys.exit(status)
