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

trigger-proxy-proxy-configure-ports() {
  declare desc="proxy proxy-configure-ports plugin trigger"
  declare trigger="proxy-configure-ports"
  declare APP="$1"
  local RAW_TCP_PORTS="$(get_app_raw_tcp_ports "$APP")"
  local DOKKU_PROXY_PORT=$(config_get "$APP" DOKKU_PROXY_PORT)
  local DOKKU_PROXY_SSL_PORT=$(config_get "$APP" DOKKU_PROXY_SSL_PORT)
  local DOKKU_PROXY_PORT_MAP=$(config_get "$APP" DOKKU_PROXY_PORT_MAP)
  local IS_APP_VHOST_ENABLED=true
  local UPSTREAM_PORT="5000"

  plugn trigger domains-vhost-enabled "$APP" 2>/dev/null || IS_APP_VHOST_ENABLED=false

  if [[ -z "$DOKKU_PROXY_PORT" ]] && [[ -z "$RAW_TCP_PORTS" ]]; then
    if [[ "$IS_APP_VHOST_ENABLED" == "false" ]]; then
      dokku_log_info1 "No proxy port set, setting to random open high port"
      local PROXY_PORT=$(get_available_port)
    else
      local PROXY_PORT=$(config_get --global DOKKU_PROXY_PORT)
      PROXY_PORT=${PROXY_PORT:=80}
    fi
    DOKKU_QUIET_OUTPUT=1 config_set --no-restart "$APP" DOKKU_PROXY_PORT="$PROXY_PORT"
  fi
  if [[ -z "$DOKKU_PROXY_SSL_PORT" ]]; then
    if [[ "$(plugn trigger certs-exists "$APP")" == "true" ]]; then
      local PROXY_SSL_PORT=$(config_get --global DOKKU_PROXY_SSL_PORT)
      PROXY_SSL_PORT=${PROXY_SSL_PORT:=443}
      if [[ -z "$RAW_TCP_PORTS" ]] && [[ "$IS_APP_VHOST_ENABLED" == "false" ]]; then
        dokku_log_info1 "No proxy ssl port set, setting to random open high port"
        PROXY_SSL_PORT=$(get_available_port)
      fi
      DOKKU_QUIET_OUTPUT=1 config_set --no-restart "$APP" DOKKU_PROXY_SSL_PORT="$PROXY_SSL_PORT"
    fi
  fi
  if [[ -z "$DOKKU_PROXY_PORT_MAP" ]]; then
    if [[ -n "$RAW_TCP_PORTS" ]]; then
      local RAW_TCP_PORT
      for RAW_TCP_PORT in $RAW_TCP_PORTS; do
        local PROXY_PORT_MAP+=" http:${RAW_TCP_PORT}:${RAW_TCP_PORT} "
      done
    else
      local PROXY_PORT=${PROXY_PORT:-$DOKKU_PROXY_PORT}
      local PROXY_SSL_PORT=${PROXY_SSL_PORT:-$DOKKU_PROXY_SSL_PORT}
      [[ -f "$DOKKU_ROOT/$APP/PORT.web.1" ]] && local UPSTREAM_PORT="$(<"$DOKKU_ROOT/$APP/PORT.web.1")"
      if [[ -n "$PROXY_PORT" ]] && [[ -n "$PROXY_SSL_PORT" ]]; then
        local PROXY_PORT_MAP+=" http:${PROXY_PORT}:$UPSTREAM_PORT https:${PROXY_SSL_PORT}:$UPSTREAM_PORT "
      elif [[ -n "$PROXY_PORT" ]]; then
        local PROXY_PORT_MAP+=" http:${PROXY_PORT}:$UPSTREAM_PORT "
      fi
    fi
    if [[ -n "$PROXY_PORT_MAP" ]]; then
      local PROXY_PORT_MAP="$(echo "$PROXY_PORT_MAP" | xargs)"
      local PROXY_PORT_MAP+=" $(merge_dedupe_list "$(remove_val_from_list "$PORT_MAP" "$DOKKU_PROXY_PORT_MAP" " ")" " ") "
      DOKKU_QUIET_OUTPUT=1 config_set --no-restart "$APP" DOKKU_PROXY_PORT_MAP="$PROXY_PORT_MAP"
    fi
  fi
}
trigger-proxy-proxy-configure-ports "$@"
