#!/usr/bin/python

from twisted.python import usage
import McFoo.commands
import McFoo.config
import sys, os, os.path

class UnknownCommand(usage.UsageError):
    pass

class Options(usage.Options):
    optFlags = [
        ]

    synopsis = "Usage: %s [options] cmd [cmdoptions]" % os.path.basename(sys.argv[0])

    def __init__(self):
        usage.Options.__init__(self)
        self.opts['help']=0

    def parseArgs(self, *a):
        self.args = a

    def postOptions(self):
        if self.args:
            if self.opts['help']:
                self.args = self.args+('--help',)
            cmd=self.args[0]
            if cmd not in McFoo.commands.__all__:
                raise UnknownCommand, ("unknown command: %s" % cmd)
            else:
                m=self._get_cmd(cmd, ["Options"])
                cmd_config=m.Options()
                cmd_config.parseOptions(self.args[1:])
        else:
            usage.Options.opt_help(self)

    def opt_help(self):
        """display this help and exit"""
        self._generic_flag('help')

    opt_h = opt_help

    def opt_host(self, hostname):
        """host that runs the dj server"""
        McFoo.config.store.host = hostname

    opt_H = opt_host
    host = McFoo.config.store.host

    def opt_port(self, port):
        """port the dj server listens to"""
        McFoo.config.store.port = int(port)
        
    opt_P = opt_port
    port = McFoo.config.store.port

    def _get_cmd(self, cmd, names=[]):
        m=__import__("McFoo.commands."+cmd,
                     globals(), locals(), names)
        return m

    def opt_version(self):
        """output version information and exit"""
        print "McFoo v42"
        import __main__
        print __main__.__doc__
        sys.exit(0)

    opt_v = opt_version

    def __str__(self, width=None):
        if not width:
            width = int(os.environ.get('COLUMNS', '80'))
        s=usage.Options.__str__(self, width)
        longdesc={}
        for cmd in McFoo.commands.__all__:
            m=self._get_cmd(cmd, ["description", "__doc__"])
            if not (getattr(m, "description", None) is None):
                longdesc[cmd]=m.description
            elif not (getattr(m, "__doc__", None) is None):
                longdesc[cmd]=m.__doc__
        if longdesc:
            s=s+"Commands:\n"
            for cmd in longdesc.keys():
                s=s+"  %-14s %s\n"%(cmd, longdesc[cmd])
        return s


try:
    config = Options()
    config.parseOptions()
except usage.UsageError, ue:
    print "%s: %s" % (sys.argv[0], ue)
