#!/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

