#!/usr/bin/env bash
set -euo pipefail

SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
# shellcheck source=/dev/null
source "$SCRIPT_DIR/libenv.sh"

log() { printf '[limristem-mail-srs] %s\n' "$*"; }

require_root() {
  if [[ $EUID -ne 0 ]]; then
    log "Questo script va eseguito come root."
    exit 1
  fi
}

load_env() {
  # Save caller-provided variables so the env file does not overwrite them.
  local -A _saved=()
  local _var
  for _var in LIMRISTEM_MAIL_ENABLE_SRS LIMRISTEM_MAIL_SRS_DOMAIN LIMRISTEM_MAIL_PRIMARY_DOMAIN \
              LIMRISTEM_MAIL_DB_HOST LIMRISTEM_MAIL_DB_PORT \
              LIMRISTEM_MAIL_DB_USER LIMRISTEM_MAIL_DB_PASS LIMRISTEM_MAIL_DB_NAME; do
    if [[ -v $_var ]]; then
      _saved[$_var]=${!_var}
    fi
  done
  limristem_mail_load_env_file "$(limristem_mail_resolve_main_env_file)"
  # Restore explicitly-passed values.
  for _var in "${!_saved[@]}"; do
    printf -v "$_var" '%s' "${_saved[$_var]}"
    # shellcheck disable=SC2163  # _var intentionally contains the variable name to export.
    export "$_var"
  done
}

mysql_client_cmd() {
  if command -v mariadb >/dev/null 2>&1; then
    printf 'mariadb\n'
  else
    printf 'mysql\n'
  fi
}

update_postsrsd_defaults() {
  local defaults_file exclude_domains tmp_defaults
  defaults_file=/etc/default/postsrsd
  if [[ ! -f "$defaults_file" ]]; then
    log "Config /etc/default/postsrsd non trovata (atteso prima del primo setup completo): nessuna modifica."
    return 1
  fi

  exclude_domains=''
  if [[ -s "$1" ]]; then
    exclude_domains=$(paste -sd, "$1")
  fi

  tmp_defaults=$(mktemp)
  awk -v srs_domain="${LIMRISTEM_MAIL_SRS_DOMAIN:-}" -v exclude_domains="$exclude_domains" '
    BEGIN { updated_domain=0; updated_exclude=0 }
    /^SRS_DOMAIN=/ {
      print "SRS_DOMAIN=" srs_domain
      updated_domain=1
      next
    }
    /^SRS_EXCLUDE_DOMAINS=/ {
      print "SRS_EXCLUDE_DOMAINS=" exclude_domains
      updated_exclude=1
      next
    }
    { print }
    END {
      if (!updated_domain) {
        print "SRS_DOMAIN=" srs_domain
      }
      if (!updated_exclude) {
        print "SRS_EXCLUDE_DOMAINS=" exclude_domains
      }
    }
  ' "$defaults_file" > "$tmp_defaults"
  if cmp -s "$tmp_defaults" "$defaults_file"; then
    rm -f "$tmp_defaults"
    return 1
  fi
  install -m 0644 "$tmp_defaults" "$defaults_file"
  rm -f "$tmp_defaults"
}

main() {
  require_root
  load_env

  if [[ "${LIMRISTEM_MAIL_ENABLE_SRS:-no}" != "yes" ]]; then
    exit 0
  fi

  local mysql_cmd output_file defaults_changed=0 managed_config_dir mysql_error tmp_file last_error attempt
  mysql_cmd=$(mysql_client_cmd)
  managed_config_dir=$(limristem_mail_resolve_managed_config_dir)
  output_file=$managed_config_dir/postsrsd.domains
  tmp_file=$(mktemp)
  mysql_error=$(mktemp)
  trap 'rm -f "${tmp_file:-}" "${mysql_error:-}"' EXIT

  limristem_mail_prepare_managed_dir "$managed_config_dir"
  log "Recupero domini SRS dal database"
  : > "$tmp_file"
  for attempt in 1 2 3 4 5; do
    if MYSQL_PWD="${LIMRISTEM_MAIL_DB_PASS}" timeout 30 "$mysql_cmd" --connect-timeout=5 -Nse 'SELECT name FROM domains WHERE is_active=1 ORDER BY name;' \
      -h "${LIMRISTEM_MAIL_DB_HOST}" \
      -P "${LIMRISTEM_MAIL_DB_PORT}" \
      -u"${LIMRISTEM_MAIL_DB_USER}" \
      "${LIMRISTEM_MAIL_DB_NAME}" > "$tmp_file" 2> "$mysql_error"; then
      break
    fi
    last_error=$(tr -d '\r' < "$mysql_error" | tail -n 1)
    if [[ $attempt -lt 5 ]]; then
      log "Tentativo $attempt/5 di recupero domini SRS fallito: ${last_error:-errore sconosciuto}. Riprovo..."
      sleep "$attempt"
      : > "$tmp_file"
      continue
    fi
    log "Query domini SRS fallita: ${last_error:-errore sconosciuto}. Nessuna modifica."
    exit 1
  done
  if [[ -n "${LIMRISTEM_MAIL_SRS_DOMAIN:-}" ]]; then
    printf '%s\n' "${LIMRISTEM_MAIL_SRS_DOMAIN}" >> "$tmp_file"
  fi
  if [[ -n "${LIMRISTEM_MAIL_PRIMARY_DOMAIN:-}" ]]; then
    printf '%s\n' "${LIMRISTEM_MAIL_PRIMARY_DOMAIN}" >> "$tmp_file"
  fi
  sort -u "$tmp_file" -o "$tmp_file"

  if [[ ! -f "$output_file" ]] || ! cmp -s "$tmp_file" "$output_file"; then
    limristem_mail_install_managed_file "$tmp_file" "$output_file" 0660
    defaults_changed=1
  fi

  if update_postsrsd_defaults "$tmp_file"; then
    defaults_changed=1
  fi

  if [[ $defaults_changed -eq 1 ]]; then
    systemctl reload postsrsd >/dev/null 2>&1 || systemctl restart postsrsd
    log "Configurazione domini SRS aggiornata."
  fi
}

main "$@"
