#!/usr/bin/env python
import re
import sys
import termenu

def main():
    redirectedStdin, redirectedStdout = termenu.redirect_std()
    from optparse import OptionParser, IndentedHelpFormatter
    class MyHelpFormatter(IndentedHelpFormatter):
        def format_description(self, description):
            return description

    description = """\
termenu %s -- a console-based in-line interactive menu

Examples:
  ls | termenu
  termenu -i Abort Retry Fail
  termenu -f file_with_options.txt
""" % termenu.version
    parser = OptionParser(usage="Usage: %prog [items]", description=description, formatter=MyHelpFormatter(), add_help_option=False)
    parser.add_option("--help", help="Show help message", action="store_true", default=False)
    parser.add_option("-f", "--file", help="Take menu items from a file", metavar="FILE")
    parser.add_option("-t", "--title", help="A title for the menu", default="")
    parser.add_option("-d", "--default", help="Default item to select", metavar="OPTION")
    parser.add_option("-h", "--height", type="int", help="Max height [10]", metavar="N", default=10)
    parser.add_option("-w", "--width", type="int", help="Max width [terminal width]", metavar="N", default=None)
    parser.add_option("-o", "--one", action="store_true", help="Don't show a menu if only one option was given")
    parser.add_option("-p", "--precolored", action="store_true", help="Preserve ANSI coloring in supplied options")
    parser.add_option("-i", "--inline", action="store_true", help="Show small inline menu on a single line")
    parser.add_option("--single", dest="multiselect", action="store_false", default=True, help="Single selection only")
    (options, args) = parser.parse_args()

    if options.help:
        parser.print_help()
        sys.exit(255)

    items = []

    try:
        if options.file:
            items = open(options.file).readlines()
        elif len(args) > 0:
            items = args
        else:
            items = redirectedStdin.readlines()
    except IOError as e:
        parser.error(str(e))

    if not items:
        parser.error("no menu items provided")

    # fixed extra spaces in items
    items = [re.sub("\s+", " ", item.strip()) for item in items]
    # make the list unique
    seen = set()
    items = [x for x in items if x not in seen and not seen.add(x)]

    plugins = [termenu.FilterPlugin()]

    if options.precolored:
        plugins.append(termenu.PrecoloredPlugin())

    if options.title:
        plugins.append(termenu.TitlePlugin(options.title))

    if options.one and len(items) == 1:
        results = [items[0]]
    else:
        if options.inline:
            results = [str(termenu.Minimenu(items, default=options.default).show())]
        else:
            results = termenu.Termenu(items,
                default=options.default,
                height=options.height,
                width=options.width,
                multiselect=options.multiselect,
                plugins=plugins).show()

    if results:
        redirectedStdout.write("\n".join(results) + "\n")

if __name__ == "__main__":
    main()
