#!/usr/bin/env bash
source $HOME/.gamerc
set -euo pipefail

# 使用說明
usage() {
  cat <<'EOF'
用法：
  pg_param_check.sh 參數=資料 [參數=資料 ...]
  或
  pg_param_check.sh "max_connections=100, huge_pages=off, work_mem=9709kb"

說明：
  - 參數清單可用空白或逗號分隔。
  - 透過 psql SHOW 讀取實際值並比對，輸出 CSV 到 STDOUT。
  - 連線預設 -U postgres；可用 PG* 環境變數覆蓋（PGHOST/PGPORT/PGDATABASE/PGUSER/PGPASSWORD）。

範例：
  PGHOST=127.0.0.1 PGDATABASE=postgres pg_param_check max_connections=100 huge_pages=off work_mem=9709kb
  pg_param_check "max_connections=100, huge_pages=off, max_worker_processes=4, max_parallel_workers=2"
EOF
}

if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
  usage
  exit 0
fi

PSQL_BIN="${PSQL_BIN:-psql}"
PGUSER="${PGUSER:-postgres}"   # 預設用 postgres 使用者，其他連線參數請用 PG* 環境變數

# 將所有參數合併成一個字串，統一把逗號替換成空白再分割
all_input="$*"
all_input="${all_input//,/ }"

# 列印 CSV 標頭
#echo "參數名稱,參數資料,PostgreSQL參數資料,結果"
echo "==================================="
echo "// $HOST_NAME"

# 取值函式：回傳空字串代表失敗
show_param() {
  local name="$1"
  # -A: 無對齊, -t: 只輸出資料, -q: 安靜, -c: 指令
  # STDERR 導到 /dev/null，失敗用非 0 code。
  set +e
  local out
  out="$("$PSQL_BIN" -Atqc "SHOW ${name};" 2>/dev/null)"
  local rc=$?
  set -e
  if [[ $rc -ne 0 || -z "${out}" ]]; then
    echo ""
    return 1
  else
    # 去除前後空白與換行
    echo -n "${out}" | awk '{$1=$1;print}'
    return 0
  fi
}

# 正規化：轉小寫並移除所有空白，讓 kb/kB、大小寫與多餘空白不影響比對
normalize() {
  tr '[:upper:]' '[:lower:]' | tr -d ' '
}

# 逐一處理 token
for token in $all_input; do
  # 忽略空字串
  [[ -z "$token" ]] && continue

  # 必須為 name=value 格式
  if [[ "$token" != *"="* ]]; then
    # 格式不符，輸出 not found
    name="$token"
    in_val=""
    echo "${name},${in_val},(not found),X"
    continue
  fi

  name="${token%%=*}"
  in_val="${token#*=}"

  # 取得實際值
  if actual_val="$(show_param "$name")"; then
    :
  else
    actual_val="(not found)"
  fi

  # 比對（大小寫不敏感、移除空白）
  n_in="$(printf "%s" "$in_val" | normalize)"
  n_actual="$(printf "%s" "$actual_val" | normalize)"

  if [[ "$actual_val" == "(not found)" ]]; then
    result="X"
  elif [[ "$n_in" == "$n_actual" ]]; then
    result="O"
  else
    result="X"
  fi

  # CSV 輸出
  echo "${name},${in_val},${actual_val},${result}"
done

echo "==================================="
