#!/usr/bin/env bash
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"

AVAILABLE_PHASES=(build deploy run)

get_phase_file_path() {
  declare desc="return docker-options config file path for specified phase"
  local phase_file_prefix="DOCKER_OPTIONS_"
  local phase=$1
  [[ "$DOKKU_ROOT" && "$APP" && "$phase_file_prefix" && "$phase" ]] || dokku_log_fail "Error: phase_file_path is incomplete."
  echo "${DOKKU_ROOT}/${APP}/${phase_file_prefix}${phase^^}"
}

get_phases() {
  declare desc="returns array of passed passes if all are in allowed array"
  local passed_phases_list="$1"
  local -r phases_allowed=$(sed -e 's/ /\|/g' <<< "${AVAILABLE_PHASES[@]}")
  local phase
  local passed_phases
  if [[ -n "$passed_phases_list" ]]; then
    OIFS=$IFS; IFS=','
    read -ra passed_phases <<< "$passed_phases_list"
    IFS=$OIFS
    for phase in "${passed_phases[@]}"; do
      [[ "$phase" = @($phases_allowed) ]] || dokku_log_fail "Phase(s) must be one of [${AVAILABLE_PHASES[*]}]"
    done
    echo "${passed_phases[@]}"
  fi
}

create_phase_file_if_required() {
  declare desc="create phase file"
  local phase_file_path="$1"
  [[ -f "$phase_file_path" ]] || {
    touch "$phase_file_path"
  }
}

display_phase_options() {
  declare desc="print docker-options for specified phase"
  local phase="$1"
  local phase_file_path="$2"
  echo "${phase^} options:"
  sed -e 's/^/    /' "$phase_file_path"
}

display_all_phases_options() {
  declare desc="print docker-options for all phases"
  local phases=("${AVAILABLE_PHASES[@]}")
  for phase in "${phases[@]}"; do
    local phase_file_path="$(get_phase_file_path "$phase")"
    if [[ -s "$phase_file_path" ]]; then
       display_phase_options "$phase" "$phase_file_path"
    fi
  done
}

display_passed_phases_options() {
  declare desc="print docker options for list of specified phases"
  local passed_phases=("${!1}")
  local phase
  for phase in "${passed_phases[@]}"; do
    local phase_file_path="$(get_phase_file_path "$phase")"
    if [[ ! -s "$phase_file_path" ]]; then
      echo "${phase^} options: none"
    else
      display_phase_options "$phase" "$phase_file_path"
    fi
  done
}

add_passed_docker_option() {
  declare desc="adds docker option to specified phases"
  local passed_phases=("${!1}")
  shift
  local passed_option_string="$*"
  local phase
  for phase in "${passed_phases[@]}"; do
    local phase_file_path="$(get_phase_file_path "$phase")"
    create_phase_file_if_required "$phase_file_path"
    echo "${passed_option_string}" >> "$phase_file_path"
    local all_phase_options="$(< "$phase_file_path")"
    echo -e "${all_phase_options}" | sed '/^$/d' | sort -u > "$phase_file_path"
  done
}

remove_passed_docker_option() {
  declare desc="removes docker option from specified phases"
  local passed_phases=("${!1}")
  shift
  local passed_option_string="$*"
  local phase
  for phase in "${passed_phases[@]}"; do
    local phase_file_path="$(get_phase_file_path "$phase")"
    [[ ! -s "$phase_file_path" ]] || {
      local all_phase_options="$(< "$phase_file_path")"
      local all_phase_options=$(echo -e "${all_phase_options}" | sed "s#^${passed_option_string}\$##")
      echo -e "${all_phase_options}" | sed '/^$/d' | sort -u > "$phase_file_path"
    }
  done
}
