#!/bin/bash
# _lib_pg_conf.sh — pg_analyzer.conf 解析（per-target 參數覆寫）
#
# 由 pg_analyzer.sh（掃描頁）與 pg_recommend_for_spec.sh（resize 建議）共用，
# 確保兩條路徑對 conf 的解讀完全一致（workload / max_connections / 個別 param override），
# 不會再各自解析而 drift。
#
# source 後提供：
#   CONFIG_FILE                  已解析的 config 檔路徑（可能為空 = 無 conf）
#   config_lookup KEY ALIASES    依優先序回值（精確 alias > role 前綴 > default）
#   classify_workload ALIASES    回 pgtune db-type（conf db_type > alias 自動判斷 > mixed）
#   PGCONF_OVERRIDE_KEYS         可由 conf 直接覆寫 pgtune 建議的 param 清單（單一來源）
#
# Config 格式（每行）：
#   <alias_or_role_or_ip>  key1=val1  key2=val2  ...
# 匹配優先序（第一個有值就回）：
#   1. 精確 alias（GAMEDB10）
#   2. role 前綴（GAMEDB → 匹配所有 GAMEDB{N}）
#   3. "default"
# 支援的 key：db_type, max_connections, work_mem, shared_buffers, effective_cache_size,
#            maintenance_work_mem, autovacuum_work_mem, min_wal_size, max_wal_size
# 註解用 # 開頭

_LIB_PG_CONF_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# CONFIG_FILE 優先序：PG_ANALYZER_CONF env var > <lib dir>/pg_analyzer.conf > ~/bin/pg_analyzer/pg_analyzer.conf
CONFIG_FILE=""
if [[ -n "${PG_ANALYZER_CONF:-}" ]]; then
    CONFIG_FILE="$PG_ANALYZER_CONF"
elif [[ -f "${_LIB_PG_CONF_DIR}/pg_analyzer.conf" ]]; then
    CONFIG_FILE="${_LIB_PG_CONF_DIR}/pg_analyzer.conf"
elif [[ -f "${HOME}/bin/pg_analyzer/pg_analyzer.conf" ]]; then
    CONFIG_FILE="${HOME}/bin/pg_analyzer/pg_analyzer.conf"
fi

# 可由 conf 直接覆寫 pgtune 建議值的 param（掃描頁與 resize 共用同一份清單）
# shellcheck disable=SC2034  # 由 source 此 lib 的腳本（pg_analyzer.sh / pg_recommend_for_spec.sh）使用
PGCONF_OVERRIDE_KEYS="work_mem max_connections shared_buffers effective_cache_size maintenance_work_mem autovacuum_work_mem min_wal_size max_wal_size"

# 解析 config 檔某行的指定 key 值
_extract_val() {
    local line="$1" key="$2"
    echo "$line" | grep -oE "${key}=[^ ]+" | head -1 | cut -d= -f2
}

# 依 alias 查 config 檔某 key（精確 alias > role 前綴 > default）
config_lookup() {
    local key="$1" aliases="$2"
    [[ ! -f "$CONFIG_FILE" ]] && return

    # 1. 精確 alias 匹配
    for a in $aliases; do
        local line
        line=$(awk -v a="$a" '!/^#/ && !/^$/ && $1==a {print; exit}' "$CONFIG_FILE")
        if [[ -n "$line" ]]; then
            local val
            val=$(_extract_val "$line" "$key")
            if [[ -n "$val" ]]; then echo "$val"; return; fi
        fi
    done

    # 2. Role 前綴匹配（去掉尾端數字）
    for a in $aliases; do
        local role="${a%%[0-9]*}"  # ACCOUNTDB (no digits) / GAMEDB / WORLDDB / etc.
        if [[ "$role" == "$a" ]]; then continue; fi   # 沒數字的 alias 已在步驟 1 檢查過
        [[ -z "$role" ]] && continue
        local line
        line=$(awk -v a="$role" '!/^#/ && !/^$/ && $1==a {print; exit}' "$CONFIG_FILE")
        if [[ -n "$line" ]]; then
            local val
            val=$(_extract_val "$line" "$key")
            if [[ -n "$val" ]]; then echo "$val"; return; fi
        fi
    done

    # 3. default fallback
    local line
    line=$(awk '!/^#/ && !/^$/ && $1=="default" {print; exit}' "$CONFIG_FILE")
    if [[ -n "$line" ]]; then
        local val
        val=$(_extract_val "$line" "$key")
        [[ -n "$val" ]] && echo "$val"
    fi
}

# 依照該機器上的 alias 判斷 workload type
# 優先序：config 檔 db_type=xxx > alias 自動判斷 > mixed (fallback)
# pgtune 5 種：web / oltp / dw / desktop / mixed
classify_workload() {
    local aliases="$1"
    # 先查 config 檔
    local cfg_val
    cfg_val=$(config_lookup "db_type" "$aliases" 2>/dev/null || true)
    if [[ -n "$cfg_val" ]]; then
        echo "$cfg_val"
        return
    fi
    # alias 自動判斷（N1 的經驗值）
    if echo "$aliases" | grep -qE '\bGAMEDB[0-9]+|\bWORLDDB[0-9]+|\bSOCIETYDB[0-9]+|\bCHATS[0-9]+|\bRANKS[0-9]+'; then
        echo "oltp"
    elif echo "$aliases" | grep -q 'ACCOUNTDB'; then
        echo "mixed"
    else
        echo "mixed"
    fi
}
