#!/usr/bin/python3
"""
Usage: %(appname)s [-hVv][-l level][infile..|-]
       -h, --help           this message
       -V, --version        print version and exit
       -v, --verbose        verbose mode (cumulative)
       -l, --level #        1 = rev (default), 2 = version and rev

filter version and build revisions from package lists

eg:
$ echo file-magic-5.19-8.15 | %(appname)s -l2
file-magic

Copyright:
(c)2017 by %(author)s

License:
%(license)s
"""
#
# vim:set et ts=8 sw=4:
#

__version__ = '0.1'
__author__ = 'Hans-Peter Jansen <hpj@urpla.net>'
__license__ = 'GNU GPL 2 - see http://www.gnu.org/licenses/gpl2.txt for details'


import os
import sys
import getopt
import logging
import logging.handlers

IO_ERROR = 4
INTR_ERROR = 8

class gpar:
    """ global parameter class """
    appdir, appname = os.path.split(sys.argv[0])
    if appdir == '.':
        appdir = os.getcwd()
    if appname.endswith('.py'):
        appname = appname[:-3]
    version = __version__
    author = __author__
    license = __license__
    loglevel = logging.WARNING
    level = 1

log = logging.getLogger(gpar.appname)

# we need encoding failure tolerant i/o handling
seopen = lambda fd: open(fd, 'w',
                         encoding = 'utf-8',
                         errors = 'surrogateescape',
                         closefd = False)

sys.stdout = seopen(1)
sys.stderr = seopen(2)

stdout = lambda *s: print(*s, file = sys.stdout, flush = True)
stderr = lambda *s: print(*s, file = sys.stderr, flush = True)


def exit(ret = 0, msg = None, usage = False):
    """ terminate process with optional message and usage """
    if msg:
        stderr('%s: %s' % (gpar.appname, msg))
    if usage:
        stderr(__doc__ % gpar.__dict__)
    sys.exit(ret)


def setup_logging(loglevel):
    """ setup various aspects of logging facility """
    logconfig = dict(
        level = loglevel,
        format = '%(asctime)s %(levelname)5s: [%(name)s] %(message)s',
        datefmt = '%Y-%m-%d %H:%M:%S',
    )
    logging.basicConfig(**logconfig)


def main():
    ''' Command line interface and console script entry point '''
    try:
        optlist, args = getopt.getopt(sys.argv[1:], 'hVvl:',
            ('help', 'version', 'verbose', 'level')
        )
    except getopt.error as msg:
        exit(1, msg, True)

    for opt, par in optlist:
        if opt in ('-h', '--help'):
            exit(usage = True)
        elif opt in ('-V', '--version'):
            exit(msg = 'version %s' % gpar.version)
        elif opt in ('-v', '--verbose'):
            if gpar.loglevel > logging.DEBUG:
                gpar.loglevel -= 10
        elif opt in ('-l', '--level'):
            try:
                gpar.level = int(par)
            except ValueError:
                exit(2, 'invalid value <%s> for level' % par)

    setup_logging(gpar.loglevel)

    level = gpar.level
    ret = 0

    if not args:
        args.append('-')

    for input in args:
        if input == '-':
            input = sys.stdin
        else:
            try:
                input = open(input, 'r',
                             encoding = 'utf-8',
                             errors = 'surrogateescape')
            except OSError as e:
                log.error(e)
                ret |= IO_ERROR
        try:
            for line in input:
                token = line.split('-')[:-level]
                stdout('-'.join(token))
        except KeyboardInterrupt:
            ret |= INTR_ERROR
            break

    return ret

if __name__ == '__main__':
    exit(main())
