#!/bin/bash
# 응용 예제 ② — upstream 로드 밸런서 (RR / weighted / ip_hash / least_conn)
# 사전: setup.sh 로 nginx 띄움 + 백엔드 :3000·:3001 띄움
# 사용: bash setup_03_upstream_lb.sh [rr|weighted|ip_hash|least_conn]
set -e

MODE="${1:-rr}"
CFG_TEMPLATE="$(dirname "$0")/configs/03_lab-upstream-lb"

# 1) 두 번째 백엔드 (:3001) 확인 — 안 떴으면 띄우는 가이드 안내
if ! ss -tln | grep -q ":3001 "; then
    echo "⚠️  백엔드 :3001 미실행. 다른 터미널에서:"
    echo "    mkdir -p /tmp/site2 && cd /tmp/site2"
    echo "    echo '<h1>Backend 2 — API</h1>' > index.html"
    echo "    python3 -m http.server 3001 --bind 127.0.0.1"
    echo
    read -p "백엔드 :3001 띄운 후 Enter (또는 Ctrl+C 종료) ..."
fi

# 2) MODE 에 따라 conf 의 upstream 블록 활성화
TMP=$(mktemp)
case "$MODE" in
    rr)         start_line=4; end_line=7  ;;   # 라운드로빈 (기본 활성)
    weighted)   start_line=10; end_line=14 ;;
    ip_hash)    start_line=17; end_line=21 ;;
    least_conn) start_line=24; end_line=28 ;;
    *) echo "MODE 는 rr|weighted|ip_hash|least_conn 중 하나"; exit 1 ;;
esac

# 모든 upstream 블록 주석 처리 후, 선택된 블록만 활성화
python3 - "$CFG_TEMPLATE" "$TMP" "$start_line" "$end_line" <<'PY'
import sys, re
src, dst, s, e = sys.argv[1:5]
s, e = int(s), int(e)
lines = open(src).readlines()
in_up = False
out = []
for i, ln in enumerate(lines, 1):
    # 모든 upstream 줄을 우선 주석화 (기존 활성/주석 무관)
    stripped = ln.lstrip()
    is_upstream_line = (
        stripped.startswith("upstream ") or
        (in_up and (stripped.startswith("server ") or stripped.startswith("ip_hash;")
                    or stripped.startswith("least_conn;") or stripped == "}\n"))
    )
    if stripped.startswith("upstream "):
        in_up = True
    out_line = ln
    if is_upstream_line:
        if not ln.lstrip().startswith("#"):
            out_line = "# " + ln
        if in_up and ln.strip() == "}":
            in_up = False
    # 선택된 블록 범위만 다시 unindent
    if s <= i <= e:
        out_line = out_line.lstrip("#").lstrip()
        if not out_line.endswith("\n"): out_line += "\n"
    out.append(out_line)
open(dst, "w").writelines(out)
PY

sudo cp "$TMP" /etc/nginx/sites-available/lab-upstream
rm -f "$TMP"

# 3) 활성화 + 다른 site 비활성화
sudo rm -f /etc/nginx/sites-enabled/lab-proxy \
           /etc/nginx/sites-enabled/lab-location \
           /etc/nginx/sites-enabled/default
sudo ln -sf /etc/nginx/sites-available/lab-upstream \
            /etc/nginx/sites-enabled/lab-upstream

sudo nginx -t
sudo systemctl reload nginx

# 4) 분배 검증
echo
echo "=== $MODE 모드 분배 검증 (10회 요청) ==="
for i in $(seq 1 10); do
    curl -s http://localhost/
done | sort | uniq -c
echo
echo "→ 로그: sudo tail /var/log/nginx/lab-upstream.access.log"
