#!/usr/bin/python

# Authors:
#   Jason Gerard DeRose <jderose@redhat.com>
#
# Copyright (C) 2008  Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; version 2 only
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

"""
Command Line Interface to IPA.

Just proof of concept stuff in here right now.
"""

import sys
from ipalib import api
from ipalib.cli import CLI
import ipalib.load_plugins

cli = CLI(api)
cli.run()

sys.exit()

TAB_WIDTH = 2

def _(msg):
    """
    Dummy gettext function for testing.
    """
    return msg

class row(object):
    def __init__(self, tab, c1, c2=None):
        assert type(tab) is int
        assert type(c1) in (str, int)
        assert type(c2) is str or c2 is None
        self.tab = tab
        self.c1 = c1
        self.c2 = c2

    def __len__(self):
        return len(str(self.c1))

    def pretty_print(self, just):
        tab = ' ' * (self.tab * TAB_WIDTH)
        if self.c2 is None:
            print '%s%s' % (tab, self.c1)
        else:
            if type(self.c1) is int:
                c1 = str(self.c1).rjust(just)
            else:
                c1 = self.c1.ljust(just)
            print '%s%s %s' % (tab, c1,    self.c2)

def pretty_print(rows):
    rows = tuple(rows)
    def get_lengths():
        yield 0
        for r in rows:
            if r.c2 is not None:
                yield len(r)
    max_len = max(get_lengths())
    for r in rows:
        r.pretty_print(max_len)


def print_commands():
    print 'Commands:'
    m = api.max_cmd_len
    for cmd in api.cmd:
        print '  %s  %s' % (str(cmd).ljust(m), cmd.get_doc(_))

def print_help(cmd):
    print 'Help on %s' % cmd














def print_api():
    def iter_api(tab):
        for name in api:
            ns = getattr(api, name)
            yield row(
                tab,
                name,
                repr(ns),
            )
            for i in ns:
                yield row(
                    tab + 1,
                    i.name,
                    repr(i)
                )

    def iter_obj(tab):
        for obj in api.obj:
            yield row(
                tab,
                obj.name,
                repr(obj),
            )
            for (n, f) in [('mthd', '.%s()'), ('prop', '.%s')]:
                ns = getattr(obj, n)
                yield row(
                    tab + 1,
                    n,
                    repr(ns),
                )
                for attr in ns:
                    yield row(
                        tab + 2,
                        f % attr.name,
                        repr(attr),
                    )

    def iter_summary(tab):
        for name in api:
            ns = getattr(api, name)
            yield row(
                tab,
                len(ns),
                name
            )

    def print_heading(h):
        print '\n%s:' % h
        print '-' * (len(h) + 1)

    tab = 1
    print_heading('API Overview')
    pretty_print(iter_api(tab))

    print_heading('Object Details')
    pretty_print(iter_obj(tab))

    print_heading('Summary')
    pretty_print(iter_summary(tab))





if len(sys.argv) < 2:
    print_commands()
    print 'Usage: ipa COMMAND [OPTIONS]'
    sys.exit(2)
name= sys.argv[1]
if name == '_api_':
    print_api()
    sys.exit()
elif name not in api.cmd:
    print_commands()
    print 'ipa: ERROR: unknown command %r' % name
    sys.exit(2)
api.cmd[name]()
