#!/usr/bin/env bash
#   2026-06-26 yjmoon  RUN 500 응급 복구 — build_no 컬럼만 추가
#   한박자로 build_no 컬럼이 안 생겨 패치 시작(insert_job)이 500 나는 서버용.
#   막힌 컬럼 하나만 풀어준다. 나머지 스키마는 그 뒤 패치가 알아서 맞춘다.
#   하는 일: ALTER TABLE ... ADD COLUMN IF NOT EXISTS 하나뿐 — 데이터 변경 0, 멱등.
#
#   실행:   bash recover_run500.sh        (반드시 bash 로, sh 아님)
#   권한:   docker 권한 없으면 sudo bash recover_run500.sh
#   다중:   PRISM 스택이 한 호스트에 2개 이상이면  PRISM_PG=<컨테이너명> bash recover_run500.sh
#   전달:   줄바꿈은 LF. Windows CRLF 면  sed -i 's/\r$//' recover_run500.sh
set -euo pipefail

#   CRLF 조기 점검 (Windows 경유 전달 대비)
if grep -q $'\r' "$0" 2>/dev/null; then
  echo "  이 스크립트에 Windows 줄바꿈(CRLF)이 섞여있습니다."
  echo "  변환 후 다시 실행하세요:  sed -i 's/\\r\$//' \"$0\""
  exit 1
fi

echo "PRISM RUN 500 복구 시작"

#   0) docker 사용 가능 점검
if ! command -v docker >/dev/null 2>&1; then
  echo "  docker 명령을 찾을 수 없습니다. Docker 가 깔린 호스트에서 실행하세요."
  exit 1
fi
if ! docker ps >/dev/null 2>&1; then
  echo "  docker 실행 권한이 없는 것 같습니다. sudo 로 다시 실행하세요:"
  echo "    sudo bash \"$0\""
  exit 1
fi

#   1) PRISM DB 컨테이너 찾기 (prism_system_update_jobs 테이블이 있는 PostgreSQL)
PG=""; PU=""; PD=""
if [ -n "${PRISM_PG:-}" ]; then
  #   사용자가 컨테이너를 직접 지정한 경우 — 자동 탐지 건너뜀
  PG="$PRISM_PG"
  PU=$(docker exec "$PG" printenv POSTGRES_USER 2>/dev/null || echo cosmos)
  PD=$(docker exec "$PG" printenv POSTGRES_DB 2>/dev/null || echo cosmos)
  echo "  지정된 DB 컨테이너 사용: $PG"
else
  MATCHES=()
  for c in $(docker ps --format '{{.Names}}'); do
    u=$(docker exec "$c" printenv POSTGRES_USER 2>/dev/null || true)
    [ -z "$u" ] && continue                   # postgres 컨테이너가 아니면 건너뜀
    d=$(docker exec "$c" printenv POSTGRES_DB 2>/dev/null || true)
    [ -z "$d" ] && d="$u"
    if docker exec "$c" psql -U "$u" -d "$d" -tAc \
         "SELECT 1 FROM information_schema.tables WHERE table_name='prism_system_update_jobs'" 2>/dev/null | grep -q 1; then
      MATCHES+=("$c|$u|$d")
    fi
  done

  if [ "${#MATCHES[@]}" -eq 0 ]; then
    echo "  PRISM DB 컨테이너를 못 찾았습니다. 'docker ps' 로 확인 후"
    echo "  PRISM_PG=<컨테이너명> bash \"$0\"  로 직접 지정해 실행하세요."
    exit 1
  fi
  if [ "${#MATCHES[@]}" -gt 1 ]; then
    echo "  PRISM DB 컨테이너가 여러 개 발견됐습니다:"
    for m in "${MATCHES[@]}"; do echo "    - ${m%%|*}"; done
    echo "  대상을 지정해 다시 실행하세요:  PRISM_PG=<컨테이너명> bash \"$0\""
    exit 1
  fi
  IFS='|' read -r PG PU PD <<< "${MATCHES[0]}"
fi
echo "  DB 컨테이너: $PG  (user=$PU  db=$PD)"

#   2) build_no 컬럼 유무 (조회 실패면 ERR)
has_build_no() {
  docker exec "$PG" psql -U "$PU" -d "$PD" -tAc \
    "SELECT count(*) FROM information_schema.columns WHERE table_name='prism_system_update_jobs' AND column_name='build_no'" 2>/dev/null || echo "ERR"
}

STATE="$(has_build_no)"
if [ "$STATE" = "ERR" ]; then
  echo "  DB 조회에 실패했습니다. 계정/컨테이너 상태를 확인하세요."
  exit 1
fi
if [ "$STATE" = "1" ]; then
  echo "  build_no 컬럼이 이미 있습니다. 복구할 것이 없습니다."
  echo "  RUN 500 이 계속되면 다른 원인일 수 있으니 로그를 확인하세요."
  exit 0
fi

#   3) 추가 (없을 때만 — 위에서 분기) — set -e 에 안 걸리게 if 로 감쌈
echo "  build_no 컬럼이 없습니다. 추가합니다..."
if ! docker exec "$PG" psql -U "$PU" -d "$PD" -v ON_ERROR_STOP=1 -c \
     "ALTER TABLE prism_system_update_jobs ADD COLUMN IF NOT EXISTS build_no varchar(16);" >/dev/null; then
  echo "  컬럼 추가에 실패했습니다(위 오류 참고). 계정 권한을 확인하세요."
  exit 1
fi

#   4) 검증
if [ "$(has_build_no)" = "1" ]; then
  echo "  build_no 컬럼 추가 완료."
else
  echo "  추가했지만 확인되지 않습니다. 수동으로 점검하세요."
  exit 1
fi

echo ""
echo "복구 끝. 화면 > 시스템 업데이트 에서 최신 번들로 다시 패치하세요."
echo "패치가 정상 완료되면 이 문제는 다시 생기지 않습니다."
