#!/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=${scriptDir}/../queues/cfgs/${DEFAULT_SC_CFG}.cfg
  source ${defaultSC_cfg}
  local defaultQS_cfg=${scriptDir}/../queues/${QUEUE_SYSTEM}/${QUEUE_SYSTEM}.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
  ${scriptDir}/../queues/commons/submit.sh --opts 

  exit $exitValue
}

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

  ${scriptDir}/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=$(echo $OPTARG | sed -e 's/sc_cfg=//g')
	    ;;
          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=${scriptDir}/../queues/cfgs/${sc_cfg}

  if [ ! -f ${scCfgFullPath} ]; then
    # CFG file doesn't exist
    display_error "${ERROR_CFG_SC}"   
  fi
 
  # Source SC CFG env
  source ${scCfgFullPath}

  # Check queue configuration env
  local queueCfgFullPath=${scriptDir}/../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
  source ${queueCfgFullPath}
}


#---------------------------------------------------
# MAIN EXECUTION
#---------------------------------------------------
  scriptDir=$(dirname $0)

  # Get command args
  get_args "$@"

  # Check other command args
  check_args

  # Submit command
  ${scriptDir}/../queues/commons/submit.sh \
       --sc_cfg=${sc_cfg} \
       ${args_pass}

