#!/bin/bash

# API 서버 배포 및 실행 스크립트
# 사용법: sudo ./runApi.sh
# 필요한 경로/파일이 다를 경우 아래 변수만 수정하세요.

set -euo pipefail

JAR_NAME="${JAR_NAME:-apiServer-0.0.1-SNAPSHOT.jar}"
PID_FILE="${PID_FILE:-/home/api.pid}"
RUN_DIR="${RUN_DIR:-/home/run}"
BUILD_DIR="${BUILD_DIR:-/home/build}"
BACKUP_DIR="${BACKUP_DIR:-/home/backup}"
JAVA_BIN="${JAVA_BIN:-/home/openjdk17/bin/java}"
# SCOUTER_AGENT="${SCOUTER_AGENT:-/home/scouter/agent.java/scouter.agent.jar}"
# SCOUTER_CONF="${SCOUTER_CONF:-/home/scouter/agent.java/conf/scouter.conf}"
SPRING_PROFILE="${SPRING_PROFILE:-real}"

timestamp() {
  date +"%Y%m%d_%H%M%S"
}

log() {
  echo "[runApi] $*"
}

ensure_paths() {
  mkdir -p "$RUN_DIR" "$BACKUP_DIR" "$BUILD_DIR"
}

stop_app() {
  if [[ -f "$PID_FILE" ]]; then
    local pid
    pid=$(cat "$PID_FILE" 2>/dev/null || true)
    if [[ -n "${pid:-}" ]] && ps -p "$pid" > /dev/null 2>&1; then
      log "기존 프로세스 종료: $pid"
      kill -9 "$pid" || true
    else
      log "PID 파일은 있으나 실행 중인 프로세스가 없습니다."
    fi
    rm -f "$PID_FILE"
  else
    log "종료할 PID 파일이 없습니다."
  fi
}

backup_old() {
  local current="$RUN_DIR/$JAR_NAME"
  if [[ -f "$current" ]]; then
    local backup="$BACKUP_DIR/oldApi_$(timestamp).jar"
    log "기존 JAR 백업 -> $backup"
    mv "$current" "$backup"
  else
    log "백업할 기존 JAR이 없습니다."
  fi
}

copy_new() {
  local source="$BUILD_DIR/$JAR_NAME"
  local target="$RUN_DIR/$JAR_NAME"

  # 소스와 타겟이 같으면 복사 불필요
  if [[ "$source" == "$target" ]]; then
    if [[ -f "$target" ]]; then
      log "배포된 JAR 확인 -> $target"
      return 0
    else
      log "새 JAR을 찾을 수 없습니다: $target"
      exit 1
    fi
  fi

  if [[ ! -f "$source" ]]; then
    log "새 JAR을 찾을 수 없습니다: $source"
    exit 1
  fi

  log "새 JAR 복사 -> $target"
  cp "$source" "$target"
}

start_app() {
  local target="$RUN_DIR/$JAR_NAME"
  log "애플리케이션 시작"
  local log_dir="${LOG_DIR:-/home/log/core}"
  local log_file="${LOG_FILE:-$log_dir/apiServer.log}"
  mkdir -p "$log_dir"

  nohup "$JAVA_BIN" \
    -Duser.timezone=GMT+09:00 \
    -Dspring.profiles.active="$SPRING_PROFILE" \
    -jar "$target" \
    >> "$log_file" 2>&1 &
  echo $! > "$PID_FILE"
  log "시작 완료 (PID: $(cat "$PID_FILE"))"
}

main() {
  ensure_paths
  stop_app
  backup_old
  copy_new
  start_app
  log "배포 완료"
}

main "$@"

