#!/bin/bash
# =============================================================
# (주)지오정보기술 홈페이지 스타트업 스크립트
# =============================================================
# 사용법: bash start.sh [dev|prod|build]
#   dev   : 개발 모드 (React 핫리로드 + Spring Boot)
#   prod  : 운영 모드 (빌드 후 단일 JAR 실행)
#   build : 빌드만 (서버 시작 안 함)
# =============================================================

set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BACKEND_DIR="$SCRIPT_DIR/backend"
FRONTEND_DIR="$SCRIPT_DIR/frontend"
MODE="${1:-dev}"

GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; NC='\033[0m'
ok()   { echo -e "${GREEN}[OK]${NC}  $*"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
fail() { echo -e "${RED}[FAIL]${NC} $*"; exit 1; }
info() { echo -e "      $*"; }

echo "=================================================="
echo "  (주)지오정보기술 홈페이지 시작"
echo "  모드: $MODE"
echo "=================================================="

# ── 1. Java 확인 ──────────────────────────────────────────────
if ! command -v java &>/dev/null; then
  fail "Java가 설치되지 않았습니다. setup_ubuntu.sh 또는 setup_windows.ps1을 먼저 실행하세요."
fi
JAVA_VER=$(java -version 2>&1 | head -1 | awk -F'"' '{print $2}' | cut -d'.' -f1)
ok "Java $JAVA_VER 감지"

# ── 2. Maven 감지 및 설치 ────────────────────────────────────
ensure_maven() {
  # mvnw (Wrapper) 우선 확인
  if [[ -f "$BACKEND_DIR/mvnw" ]]; then
    chmod +x "$BACKEND_DIR/mvnw"
    ok "Maven Wrapper(mvnw) 사용 — 별도 Maven 설치 불필요"
    MVN="$BACKEND_DIR/mvnw"
    return
  fi

  # 시스템 Maven 확인
  if command -v mvn &>/dev/null; then
    MVN_VER=$(mvn --version 2>/dev/null | head -1 | awk '{print $3}')
    ok "시스템 Maven $MVN_VER 감지"
    MVN="mvn"
    return
  fi

  # Maven 없음 → 자동 설치
  warn "Maven이 설치되지 않았습니다. 자동 설치를 진행합니다..."
  install_maven
  MVN="mvn"
}

install_maven() {
  MAVEN_VER="${MAVEN_VER:-3.9.6}"
  MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VER}/binaries/apache-maven-${MAVEN_VER}-bin.tar.gz"
  MAVEN_HOME="/opt/maven"

  # OS 감지하여 패키지 관리자로 우선 시도
  if command -v apt-get &>/dev/null; then
    info "apt로 Maven 설치 시도..."
    apt-get install -y -qq maven 2>/dev/null && {
      ok "Maven 설치 완료 (apt)"
      return
    }
  elif command -v dnf &>/dev/null; then
    dnf install -y maven 2>/dev/null && { ok "Maven 설치 완료 (dnf)"; return; }
  elif command -v yum &>/dev/null; then
    yum install -y maven 2>/dev/null && { ok "Maven 설치 완료 (yum)"; return; }
  fi

  # 패키지 관리자 실패 → 수동 설치
  info "Maven ${MAVEN_VER} 수동 설치 중..."
  MIRROR="${MAVEN_MIRROR:-$MAVEN_URL}"
  wget -q "$MIRROR" -O /tmp/maven.tar.gz \
    || fail "Maven 다운로드 실패. MAVEN_MIRROR 환경변수를 내부 미러로 설정하세요."

  mkdir -p "$MAVEN_HOME"
  tar -xzf /tmp/maven.tar.gz -C "$MAVEN_HOME" --strip-components=1
  rm -f /tmp/maven.tar.gz

  # PATH 등록
  cat > /etc/profile.d/maven.sh << MVNEOF
export MAVEN_HOME=$MAVEN_HOME
export PATH=\$MAVEN_HOME/bin:\$PATH
MVNEOF
  export MAVEN_HOME="$MAVEN_HOME"
  export PATH="$MAVEN_HOME/bin:$PATH"
  ok "Maven ${MAVEN_VER} 수동 설치 완료: $MAVEN_HOME"
}

ensure_maven

# ── 3. Node.js / npm 확인 (dev 모드) ─────────────────────────
if [[ "$MODE" == "dev" ]]; then
  if ! command -v npm &>/dev/null; then
    warn "npm이 없습니다. 프론트엔드는 빌드 없이 실행됩니다."
    info "npm 설치: https://nodejs.org 또는 nvm 사용"
    MODE="spring-only"
  else
    NPM_VER=$(npm --version)
    ok "npm $NPM_VER 감지"
  fi
fi

# ── 4. 실행 ───────────────────────────────────────────────────
case "$MODE" in

  dev)
    echo ""
    info "=== 개발 모드 시작 ==="
    info "백엔드: http://localhost:8080"
    info "프론트: http://localhost:3000"
    echo ""

    # 프론트엔드 의존성 설치
    if [[ ! -d "$FRONTEND_DIR/node_modules" ]]; then
      info "npm install 실행 중..."
      cd "$FRONTEND_DIR" && npm install
    fi

    # 백엔드 백그라운드 실행
    cd "$BACKEND_DIR"
    mkdir -p data
    info "Spring Boot 시작 중..."
    $MVN spring-boot:run &
    SPRING_PID=$!

    # 프론트엔드 포그라운드 실행
    cd "$FRONTEND_DIR"
    npm run dev &
    VITE_PID=$!

    # 종료 핸들러
    trap "kill $SPRING_PID $VITE_PID 2>/dev/null; exit" INT TERM
    wait $SPRING_PID $VITE_PID
    ;;

  spring-only)
    echo ""
    info "=== Spring Boot만 실행 (npm 없음) ==="
    cd "$BACKEND_DIR"
    mkdir -p data
    $MVN spring-boot:run
    ;;

  prod)
    echo ""
    info "=== 운영 모드 빌드 후 실행 ==="
    # React 빌드
    if command -v npm &>/dev/null; then
      cd "$FRONTEND_DIR"
      [[ ! -d node_modules ]] && npm install
      npm run build
      ok "React 빌드 완료 → backend/src/main/resources/static/"
    else
      warn "npm 없음 — 기존 빌드 결과물 사용"
    fi
    # Spring Boot 패키징
    cd "$BACKEND_DIR"
    mkdir -p data
    $MVN clean package -DskipTests -q
    ok "Spring Boot 패키징 완료"
    JAR=$(find target -name "*.jar" ! -name "*sources*" | head -1)
    info "실행: java -jar $JAR"
    java -jar "$JAR"
    ;;

  build)
    echo ""
    info "=== 빌드만 실행 ==="
    if command -v npm &>/dev/null; then
      cd "$FRONTEND_DIR"
      [[ ! -d node_modules ]] && npm install
      npm run build
      ok "React 빌드 완료"
    fi
    cd "$BACKEND_DIR"
    $MVN clean package -DskipTests -q
    JAR=$(find target -name "*.jar" ! -name "*sources*" | head -1)
    ok "빌드 완료: $JAR"
    info "실행 명령: java -jar $BACKEND_DIR/$JAR"
    ;;

  *)
    echo "사용법: bash start.sh [dev|prod|build|spring-only]"
    exit 1
    ;;
esac
