#!/bin/bash

# This script is a wrapper for programs that may have alternate versions (e.g. python2, python3).  This
# wrapper allows the user to influence the selection of the program version by setting the <program
# name>_VERSION (e.g. PYTHON_VERSION, ROBOT_VERSION, etc.) environment variable.

# Users would be expected to create a link with the base name of the program that points to this file.

# Example:
# cd openbmc-test-automation/bin
# ln -s select_version python

# The PATH variable should contain the expanded path to openbmc-test-automation/bin.

# If <program name>_VERSION is blank or not set, then the program version will be whatever the system
# default program version is.  If <program name>_VERSION is set to a value, then that value will be appended
# to the name of the program (e.g. if PYTHON_VERSION = "3", then python3 will be used.).  If <program
# name>_VERSION is set to some value that does not correspond to a valid program version for the given
# system, this program will fail.


# Make sure program_name is set.
program_name="${0##*/}"
program_uppercase_name=${program_name^^}


function get_target_program_path() {
    local target_program_path_var="${1:-target_program_path}" ; shift

    # Get the full path to the "real" program and assign it to the variable named in target_program_path_var.

    # Description of argument(s):
    # target_program_path_var         The name of the variable to receive the result.

    # Example result:

    # /usr/bin/python3

    local version_var_name
    local alternate_program_name
    local base_program_path
    local base_program_name
    local candidate
    local candidates
    local base_file_path

    # The typical use of this program would be to create a link to it like this:
    # ln -s select_version python
    # That being the case, get the name of this actual program (rather than the name of the link to it).
    base_program_path=$(readlink -f "${0}")
    base_program_name=${base_program_path##*/}

    if [ "${program_name}" == "${base_program_name}" ] ; then
        {
            echo -n "**ERROR** ${base_program_name} should never be called directly."
            echo "  Only links to ${base_program_name} should be called."
        } >&2
        exit 1
    fi

    # Compose the version_var_name value (e.g. PYTHON_VERSION).
    version_var_name=${program_uppercase_name}_VERSION
    # Compose the alternate_program_name (e.g. python3).
    alternate_program_name=${program_name}${!version_var_name}

    # Now use the "type" built-in to search the PATH variable for a list of target program candidates.
    candidates=$(type -ap ${alternate_program_name})

    # Example candidates:
    # /home/robot/openbmc-test-automation/bin/python
    # /usr/bin/python

    # In this example, the first candidate is actually a link to
    # /home/robot/openbmc-test-automation/bin/select_version.  As such it will be rejected.

    for candidate in ${candidates}
    do
        if [ -L "${candidate}" ] ; then
            # The candidate is a link so we need to see if it's a link to this program file.
            base_file_path=$(readlink "${candidate}")
            [ "${base_file_path}" == "${base_program_name}" ] && continue
        fi

        # The candidate is NOT a link so it qualifies as the desired target program path.
        eval ${target_program_path_var}=\"\${candidate}\"
        return

    done

}


# Main

get_target_program_path target_program_path

# Compose program path var name (e.g. PYTHON_PGM_PATH).
pgm_path_var_name=${program_uppercase_name}_PGM_PATH
# Set and export pgm_path_var_name (e.g. PYTHON_PGM_PATH=/usr/bin/python3).  This value can be used by
# child programs for debug.
eval export ${pgm_path_var_name}=${target_program_path}

if [ "${1}" == "--print_only" ] ; then
    echo "${target_program_path}"
else
    # Use exec in order to replace this process with the target process.
    exec ${target_program_path} "${@}"
fi

