#!python
# Copyright (C) 2015 Sebastian Pipping <sebastian@pipping.org>
# Licensed under GPL v2 or later

from __future__ import print_function

import argparse
import signal
import sys
import traceback
from textwrap import dedent

from resolve_march_native.engine import Engine
from resolve_march_native.recommended import add_recommended_flags
from resolve_march_native.sort import flags_sort_key
from resolve_march_native.version import VERSION_STR


_HORIZONTAL, _VERTICAL = range(2)


def main():
    parser = argparse.ArgumentParser(
            formatter_class=argparse.RawDescriptionHelpFormatter,
            epilog=dedent("""\
                %(prog)s is software libre licensed under GPL v2 or later,
                written by Sebastian Pipping.  Please report bugs to
                https://github.com/hartwork/resolve-march-native/issues.  Thanks!
                """),
            )
    parser.add_argument('--debug', action='store_true',
            help='enable debugging (default: disabled)')
    parser.add_argument('--gcc', default='gcc', metavar='COMMAND',
            help='gcc command (default: %(default)s)')
    parser.add_argument('--vertical', dest='formatting',
            default=_HORIZONTAL, action='store_const', const=_VERTICAL,
            help='produce vertical output (default: horizontal output)')
    parser.add_argument('--keep-identical-mtune', action='store_true',
            help='keep implied -mtune=... despite architecture identical to -march=... '
            '(default: stripped away)')
    parser.add_argument('--keep-mno-flags', action='store_true',
            help='keep -mno-* parameters (default: (superfluous ones) stripped away)')
    parser.add_argument('--keep-default-params', action='store_true',
            help='keep --param ... with values matching defaults (default: stripped away)')
    parser.add_argument('--add-recommended', '-a', action='store_true',
            help='add recommended flags (default: not added)')
    parser.add_argument('--version', action='version', version='%(prog)s ' + VERSION_STR)
    options = parser.parse_args()

    try:
        native_unrolled_flag_set = Engine(options.gcc, options.debug).run(options)
    except Exception as e:
        if options.debug:
            traceback.print_exc()
        print('ERROR: %s' % str(e), file=sys.stderr)
        sys.exit(1)

    if options.add_recommended:
        add_recommended_flags(native_unrolled_flag_set)

    if options.formatting == _VERTICAL:
        joiner = '\n'
    else:
        joiner = ' '
    print(joiner.join(sorted(native_unrolled_flag_set, key=flags_sort_key)))


if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        sys.exit(128 + signal.SIGINT)
