#!/bin/bash

#---------------------------------------------------
# SCRIPT CONSTANTS DECLARATION
#---------------------------------------------------
DEFAULT_SC_CFG="default"


#---------------------------------------------------
# ERROR CONSTANTS DECLARATION
#---------------------------------------------------
ERROR_CFG_SC="SuperComputer CFG file doesn't exist"
ERROR_CFG_Q="Queue system CFG file doesn't exist"
 
 
#---------------------------------------------------------------------------------------
# HELPER FUNCTIONS
#---------------------------------------------------------------------------------------

###############################################
# Displays usage
###############################################
usage() { 
  exitValue=$1

  # Load default CFG for default values
  local defaultSC_cfg=${SCRIPT_DIR}/../queues/cfgs/${DEFAULT_SC_CFG}.cfg
  #shellcheck source=../queues/cfgs/default.cfg
  source "${defaultSC_cfg}"
  local defaultQS_cfg=${SCRIPT_DIR}/../queues/${QUEUE_SYSTEM}/${QUEUE_SYSTEM}.cfg
  #shellcheck source=../queues/slurm/slurm.cfg
  source "${defaultQS_cfg}"
  
  # Show usage
  cat <<EOT
Usage: $0 [queue_system_options] [COMPSs_options] application_name application_arguments

* Options:
  General:
    --help, -h                              Print this help message
  
  Queue system configuration:
    --sc_cfg=<name>                         SuperComputer configuration file to use. Must exist inside queues/cfgs/
                                            Default: ${DEFAULT_SC_CFG}

  Submission configuration: 
EOT
  "${SCRIPT_DIR}"/../queues/commons/submit.sh --opts 

  exit "$exitValue"
}

###############################################
# Displays version
###############################################
display_version() {
  local exitValue=$1

  "${SCRIPT_DIR}"/runcompss --version

  exit "$exitValue"
}

###############################################
# Displays errors treating arguments
###############################################
display_error() {
  local error_msg=$1
  
  echo "$error_msg"
  echo " "
  
  usage 1
}

#---------------------------------------------------------------------------------------
# MAIN FUNCTIONS
#---------------------------------------------------------------------------------------

###############################################
# Get arguments
###############################################
get_args() {
  # Avoid enqueue if there is no application
  if [ $# -eq 0 ]; then
    usage 1
  fi

  # Parse COMPSs Options
  while getopts hvgtmd-: flag; do 
    # Treat the argument
    case "$flag" in
      h)
	# Display help
	usage 0
	;;
      v)
        # Display version
        display_version 0
        ;;
      -)
	# Check more complex arguments 
	case "$OPTARG" in
	  help)
	    # Display help
	    usage 0
	    ;;
          version)
            # Display compss version
            display_version 0
            ;;
	  sc_cfg=*)
	    sc_cfg=${OPTARG//sc_cfg=/}
	    ;;
          master_node=*)
            # Master node is automatically selected. Remove it from COMPSs flags
            echo "WARNING: master_node is automatically selected. Omitting parameter"
            ;;
          worker_nodes=*)
            # Worker nodes are automatically selected. Remove it from COMPSs flags
            echo "WARNING: worker_nodes are automatically selected. Omitting parameter"
            ;;
          *)
	    # Flag didn't match any patern. Add to COMPSs 
	    args_pass="$args_pass --$OPTARG"
	    ;;
	esac
	;;
      *)
	# Flag didn't match any patern. End of COMPSs flags
	args_pass="$args_pass -$flag"
	;; 
    esac
  done
  # Shift COMPSs arguments
  shift $((OPTIND-1))

  # Pass application name and args
  args_pass="$args_pass $*" 
}

###############################################
# Checks arguments
###############################################
check_args() {
  ###############################################################
  # SC Configuration checks
  ###############################################################
  # Check sc configuration argument
  if [ -z "${sc_cfg}" ]; then
    sc_cfg=${DEFAULT_SC_CFG}
  fi
  if [[ ${sc_cfg} != *cfg ]]; then
    # Add cfg suffix
    sc_cfg=${sc_cfg}.cfg
  fi
   
  local scCfgFullPath=${SCRIPT_DIR}/../queues/cfgs/${sc_cfg}

  if [ ! -f "${scCfgFullPath}" ]; then
    # CFG file doesn't exist
    display_error "${ERROR_CFG_SC}"   
  fi
 
  # Source SC CFG env
  # shellcheck source=../queues/slurm/slurm.cfg
  source "${scCfgFullPath}"

  # Check queue configuration env
  local queueCfgFullPath=${SCRIPT_DIR}/../queues/${QUEUE_SYSTEM}/${QUEUE_SYSTEM}.cfg
  if [ ! -f "${queueCfgFullPath}" ]; then
    # CFG file doesn't exist
    display_error "${ERROR_CFG_Q}" 
  fi

  # Source queue system CFG env
  # shellcheck source=../queues/cfgs/default.cfg
  source "${queueCfgFullPath}"
}


#---------------------------------------------------
# MAIN EXECUTION
#---------------------------------------------------
  if [ -z "$COMPSS_HOME" ]; then
     SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
     COMPSS_HOME=${SCRIPT_DIR}/../../../
  else
     SCRIPT_DIR="${COMPSS_HOME}/Runtime/scripts/user"
  fi

  # Get command args
  get_args "$@"

  # Check other command args
  check_args

  # Submit command
  # shellcheck disable=SC2086
  "${SCRIPT_DIR}"/../queues/commons/submit.sh \
       --sc_cfg=${sc_cfg} \
       ${args_pass}

