#!/usr/bin/env python3
"""boxes.py

Generate stencils for wooden boxes.

Usage:
  boxes <generator> [<args>...]
  boxes --list
  boxes (-h | --help)
  boxes --version

Options:
  -h --help     Show this screen.
  --version     Show version.
  --list        List available generators.
"""

from __future__ import print_function
import sys
import os
from pkg_resources import get_distribution

try:
    import boxes
except ImportError:
    sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..'))
    import boxes

import boxes.generators

#__version__ = get_distribution('boxes').version


def main():
    #version = 'boxes.py v{}'.format(__version__)

    if len(sys.argv) > 1 and sys.argv[1].startswith("--id="):
        del sys.argv[1]
    if len(sys.argv) == 1:
        print_usage()
    elif sys.argv[1] == '--list':
        list_grouped_generators()
    else:
        name = sys.argv[1].lower()
        if name.startswith("--generator="):
            name = name[12:]
        run_generator(name, sys.argv[2:])

def print_usage():
    print(__doc__)

def list_grouped_generators():
    print('Available generators:')
    for group in generator_groups():
        print('\n' + group.title)
        if group.description:
            print('\n%s\n' % group.description)
        else:
            print()
        for box in group.generators:
            print(' *  {}  -  {}'.format(box.__name__, box.__doc__ or ''))


def run_generator(name, args):
    generators = generators_by_name()
    lower_name = name.lower()

    if lower_name in generators.keys():
        box = generators[lower_name]()
        box.parseArgs(args)
        box.open()
        box.render()
        box.close()
    else:
        msg = ('Unknown generator \'{}\'. Use boxes --list to get a list of '
               'available commands.\n').format(name)
        sys.stderr.write(msg)


def generator_groups():
    generators = generators_by_name()
    return group_generators(generators)


def group_generators(generators):
    groups = boxes.generators.ui_groups
    groups_by_name = boxes.generators.ui_groups_by_name

    for name, generator in generators.items():
        group_for_generator = groups_by_name.get(generator.ui_group,
                                                 groups_by_name['Misc'])
        group_for_generator.add(generator)

    return groups


def generators_by_name():
    all_generators = boxes.generators.getAllBoxGenerators()

    return {
        name.split('.')[-1].lower(): generator
        for name, generator in all_generators.items()
    }


if __name__ == '__main__':
    main()