#!/usr/bin/env python3
#
# Copyright (c) 2019-2020 Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#

# Output to stdout the chosen run configuration fragments for a given run
# configuration. With -p, the script prints all fragments considered without
# validating whether it exists.

import argparse
import os
import sys

parser = argparse.ArgumentParser(description="Choose run configurations")
parser.add_argument("--print-only", "-p", action="store_true", default=False,
        help="Print only; don't check for matching run configs.")
parser.add_argument("args", nargs=argparse.REMAINDER, help="Run configuration")
opts = parser.parse_args()

if len(opts.args) != 1:
    raise Exception("Exactly one argument expected")

# Obtain path to run_config directory
script_root = os.path.dirname(os.path.abspath(sys.argv[0]))
run_config_dir = os.path.join(script_root, os.pardir, "run_config")

arg = opts.args[0]
run_config = arg.split(":")[-1]
if not run_config:
    raise Exception("Couldn't extract run config from " + arg)

if run_config == "nil":
    sys.exit(0)

fragments = run_config.split("-")
if 'bmcov' in fragments:
    fragments.remove('bmcov')
exit_code = 0

# Stems are fragments, except with everything after dot removed.
stems = list(map(lambda f: f.split(".")[0], fragments))

# Consider each fragment in turn
for frag_idx, chosen_fragment in enumerate(fragments):
    # Choose all stems upto the current fragment
    chosen = ["-".join(stems[0:i] + [chosen_fragment])
            for i in range(frag_idx + 1)]

    for i, fragment in enumerate(reversed(chosen)):
        if opts.print_only:
            print(fragment)
        else:
            # Output only if a matching run config exists
            if os.path.isfile(os.path.join(run_config_dir, fragment)):
                # Stop looking for generic once a specific fragment is found
                print(fragment)
                break
    else:
        # Ignore if the first fragment doesn't exist, which is usually the
        # platform name. Otherwise, print a warning for not finding matches for
        # the fragment.
        if (not opts.print_only) and (i > 0):
            print("warning: {}: no matches for fragment '{}'".format(
                arg, fragment), file=sys.stderr)
            exit_code = 1
sys.exit(exit_code)
