#!/usr/bin/env bash
#
# ITN-HUB 기동 스크립트 (nohup 방식).
#
# application.yml의 ${DB_URL} 같은 자리는 Spring이 "같은 이름의 환경변수"에서 찾아 채운다.
# 그래서 java를 띄우기 전에 env 파일을 읽어 export 해두기만 하면 된다.
# 비밀값을 java 명령 인자로 넘기면 `ps` 에 그대로 보이므로 반드시 환경변수로 준다.
set -euo pipefail

# ── 경로 (환경에 맞게 수정) ──────────────────────────────────────────
JAVA_HOME_BIN=/home/hubAdmin/jdk-21.0.11/bin
DEPLOY_PATH=/home/hubAdmin/deploy
FILE_NM=itnhub-0.1.0.jar
LOG_FILE_PATH=/home/hubAdmin/logs
LOG_FILE_NM=itnhub.log
PID_FILE=/home/hubAdmin/itnhub.pid

# 값이 든 파일. 소유자만 읽게 두고(chmod 600) 저장소에는 올리지 않는다.
ENV_FILE=/home/hubAdmin/itnhub.env

# ── 환경변수 주입 ────────────────────────────────────────────────────
if [ ! -f "$ENV_FILE" ]; then
  echo "환경변수 파일이 없습니다: $ENV_FILE" >&2
  echo "deploy/itnhub.env.example 을 복사해 값을 채우세요." >&2
  exit 1
fi

# set -a 를 켜면 이후 대입되는 변수가 모두 export 된다(파일에 export를 안 써도 된다).
set -a
# shellcheck disable=SC1090
. "$ENV_FILE"
set +a

# 필수 8개가 비어 있으면 기동 도중에 죽으므로 여기서 먼저 걸러낸다.
for v in DB_URL DB_USERNAME DB_PASSWORD MATTERMOST_URL MATTERMOST_TOKEN \
         MATTERMOST_TEAM_ID APP_ADMIN_USERNAME APP_ADMIN_PASSWORD; do
  if [ -z "${!v:-}" ]; then
    echo "필수 환경변수가 비어 있습니다: $v  ($ENV_FILE 확인)" >&2
    exit 1
  fi
done

# 서버 시간대가 UTC면 업무단계 도달 일시, 칸반의 D+n, 연락 이력 날짜가 9시간 어긋난다.
export TZ="${TZ:-Asia/Seoul}"
# 앱 기본 포트는 application.yml에 8877로 고정되어 있다. 필요하면 env 파일에서 바꾼다.
export SERVER_PORT="${SERVER_PORT:-8877}"

JAVA_OPTS="${JAVA_OPTS:--Xms512m -Xmx1g -Duser.timezone=Asia/Seoul -Dfile.encoding=UTF-8}"

# ── 중복 기동 방지 ───────────────────────────────────────────────────
if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then
  echo "이미 실행 중입니다 (PID $(cat "$PID_FILE")). 먼저 stop.sh 를 실행하세요." >&2
  exit 1
fi

mkdir -p "$LOG_FILE_PATH"

# ── 기동 ─────────────────────────────────────────────────────────────
nohup "$JAVA_HOME_BIN/java" $JAVA_OPTS -jar "$DEPLOY_PATH/$FILE_NM" \
  >> "$LOG_FILE_PATH/$LOG_FILE_NM" 2>&1 &

echo $! > "$PID_FILE"
echo "기동 요청 완료 (PID $(cat "$PID_FILE"), 포트 $SERVER_PORT)"

# ── 기동 확인 ────────────────────────────────────────────────────────
# actuator를 넣지 않아서 로그인 화면 200으로 확인한다.
for _ in $(seq 1 60); do
  if curl -fs -o /dev/null "http://127.0.0.1:${SERVER_PORT}/login"; then
    echo "정상 기동 확인: http://127.0.0.1:${SERVER_PORT}/login"
    exit 0
  fi
  sleep 1
done

echo "60초 안에 응답이 없습니다. 로그를 확인하세요: $LOG_FILE_PATH/$LOG_FILE_NM" >&2
exit 1
