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

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

load_env() {
  limristem_mail_load_env_file "$LIMRISTEM_MAIL_CONFIG_DIR/limristem-mail.env"
}

service_state() {
  systemctl is-active "$1" 2>/dev/null || printf 'unknown'
}

mail_queue_count() {
  postqueue -p 2>/dev/null | awk 'BEGIN{count=0} /^[A-F0-9]/ {count++} END{print count}'
}

mail_storage_bytes() {
  du -sb "${LIMRISTEM_MAIL_MAIL_HOME:-/var/mail/vhosts}" 2>/dev/null | awk '{print $1}'
}

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

db_query() {
  local sql=$1
  local mysql_cmd
  mysql_cmd=$(mysql_client_cmd)
  MYSQL_PWD="${LIMRISTEM_MAIL_DB_PASS}" "$mysql_cmd" -Nse "$sql" -h "${LIMRISTEM_MAIL_DB_HOST}" -P "${LIMRISTEM_MAIL_DB_PORT}" -u"${LIMRISTEM_MAIL_DB_USER}" "${LIMRISTEM_MAIL_DB_NAME}" 2>/dev/null || printf 'n/a'
}

redis_info_value() {
  local key=$1
  REDISCLI_AUTH="${LIMRISTEM_MAIL_REDIS_PASSWORD:-}" redis-cli -h "${LIMRISTEM_MAIL_REDIS_HOST:-127.0.0.1}" -p "${LIMRISTEM_MAIL_REDIS_PORT:-6379}" INFO "$2" 2>/dev/null | awk -F: -v k="$key" '$1 == k {gsub(/\r/,"",$2); print $2}'
}

load_env

printf 'Limristem eMail performance report\n'
printf '============================\n'
printf 'Host: %s\n\n' "${LIMRISTEM_MAIL_HOSTNAME:-unknown}"

printf 'Services\n'
printf '--------\n'
for svc in postfix dovecot rspamd redis-server mariadb nginx limristem-mail postsrsd; do
  printf '%-16s %s\n' "$svc" "$(service_state "$svc")"
done

printf '\nMail flow\n'
printf '---------\n'
printf 'Queue length: %s\n' "$(mail_queue_count)"
printf 'Mail storage bytes: %s\n' "$(mail_storage_bytes)"

printf '\nDatabase\n'
printf '--------\n'
printf 'Domains: %s\n' "$(db_query 'SELECT COUNT(*) FROM domains;')"
printf 'Accounts: %s\n' "$(db_query 'SELECT COUNT(*) FROM accounts;')"
printf 'Aliases: %s\n' "$(db_query 'SELECT COUNT(*) FROM aliases;')"
printf 'Redirects: %s\n' "$(db_query 'SELECT COUNT(*) FROM redirects;')"
printf 'Threads connected: %s\n' "$(db_query "SHOW GLOBAL STATUS LIKE 'Threads_connected';" | awk '{print $2}')"
printf 'Questions: %s\n' "$(db_query "SHOW GLOBAL STATUS LIKE 'Questions';" | awk '{print $2}')"

printf '\nRedis\n'
printf '-----\n'
printf 'Used memory: %s\n' "$(redis_info_value used_memory_human memory || true)"
printf 'Connected clients: %s\n' "$(redis_info_value connected_clients clients || true)"
printf 'Keyspace hits: %s\n' "$(redis_info_value keyspace_hits stats || true)"
printf 'Keyspace misses: %s\n' "$(redis_info_value keyspace_misses stats || true)"

printf '\nHost resources\n'
printf '--------------\n'
df -h "${LIMRISTEM_MAIL_MAIL_HOME:-/var/mail/vhosts}" /var/lib/mysql 2>/dev/null || true
printf '\n'
free -h 2>/dev/null || true

printf '\nRspamd summary\n'
printf '-------------\n'
if command -v rspamc >/dev/null 2>&1; then
  rspamc stat 2>/dev/null | sed -n '1,20p' || true
else
  printf 'rspamc non disponibile\n'
fi
