#!/usr/bin/env sh

# MULTIDEPLOY_CONFIG="default"

########  Public functions #####################

MULTIDEPLOY_VERSION="1.0"
MULTIDEPLOY_FILENAME="multideploy.yaml"

# domain keyfile certfile cafile fullchain pfx
multideploy_deploy() {
  _cdomain="$1"
  _ckey="$2"
  _ccert="$3"
  _cca="$4"
  _cfullchain="$5"
  _cpfx="$6"

  _debug _cdomain "$_cdomain"
  _debug _ckey "$_ckey"
  _debug _ccert "$_ccert"
  _debug _cca "$_cca"
  _debug _cfullchain "$_cfullchain"
  _debug _cpfx "$_cpfx"

  DOMAIN_DIR=$_cdomain
  if echo "$DOMAIN_PATH" | grep -q "$ECC_SUFFIX"; then
    DOMAIN_DIR="$DOMAIN_DIR"_ecc
  fi
  _debug2 "DOMAIN_DIR" "$DOMAIN_DIR"

  _preprocess_deployfile "$DOMAIN_DIR/$MULTIDEPLOY_FILENAME" || return 1

  MULTIDEPLOY_CONFIG="${MULTIDEPLOY_CONFIG:-$(_getdeployconf MULTIDEPLOY_CONFIG)}"
  if [ -z "$MULTIDEPLOY_CONFIG" ]; then
    MULTIDEPLOY_CONFIG="default"
    _info "MULTIDEPLOY_CONFIG is not set, so I will use 'default'."
  else
    _savedeployconf "MULTIDEPLOY_CONFIG" "$MULTIDEPLOY_CONFIG"
    _debug2 "MULTIDEPLOY_CONFIG" "$MULTIDEPLOY_CONFIG"
  fi

  # TODO: Deploy to services
}

####################  Private functions below #####################

# deploy_filepath
_preprocess_deployfile() {
  _deploy_file="$1"

  # Check if yq is installed
  if ! command -v yq >/dev/null 2>&1; then
    _err "yq is not installed! Please install yq and try again."
    return 1
  fi

  # Check if deploy file exists and create a default template if not
  if [ -f "$_deploy_file" ]; then
    _debug3 "Deploy file found."
    _check_deployfile "$_deploy_file" "$MULTIDEPLOY_CONFIG"
  else
    # TODO: Replace URL with wiki link
    _err "Deploy file not found. Go to https://CHANGE_URL_TO_WIKI to see how to create one."
    return 1
  fi
}

# deploy_filepath _deploy_config
_check_deployfile() {
  _deploy_file="$1"
  _deploy_config="$3"

  # Check version
  _deploy_file_version=$(yq '.version' "$_deploy_file")
  if [ "$MULTIDEPLOY_VERSION" != "$_deploy_file_version" ]; then
    _err "As of $PROJECT_NAME $VER, the deploy file needs version $MULTIDEPLOY_VERSION! Your current deploy file is of version $_deploy_file_version."
    return 1
  fi

  # Check if config exists
  if ! yq e ".configs[] | select(.name == \"$_deploy_config\")" "$_deploy_file" >/dev/null; then
    _err "Config '$_deploy_config' not found."
    return 1
  fi

  # Extract all services from config
  _services=$(_get_services_list "$_deploy_file" "$_deploy_config")

  if [ -z "$_services" ]; then
    _err "Config '$_deploy_config' does not have any services to deploy to."
    return 1
  fi

  # Check if extracted services exist in services list
  for _service in $_services; do
    if ! yq e ".services[] | select(.name == \"$_service\")" "$_deploy_file" >/dev/null; then
      _err "Service '$_service' not found."
      return 1
    fi

    # Check if service has hook
    if ! yq e ".services[] | select(.name == \"$_service\").hook" "$_deploy_file" >/dev/null; then
      _err "Service '$_service' does not have a hook."
      return 1
    fi

    # Check if service has environment
    if ! yq e ".services[] | select(.name == \"$_service\").environment" "$_deploy_file" >/dev/null; then
      _err "Service '$_service' does not an environment."
      return 1
    fi
  done
}

# deploy_filepath deploy_config
_get_services_list() {
  _deploy_file="$1"
  _deploy_config="$2"

  _services=$(yq e ".configs[] | select(.name == \"$_deploy_config\").services[]" "$_deploy_file")
  echo "$_services"
}

# deploy_filepath service_names
_get_full_services_list() {
  _deploy_file="$1"
  shift
  _service_names="$*"

  _full_services=""
  for _service in $_service_names; do
    _full_service=$(yq e ".services[] | select(.name == \"$_service\")" "$_deploy_file")
    _full_services="$_full_services
$_full_service"
  done

  echo "$_full_services"
}