#!/bin/bash
# 워터마크 시작.app → Resources/launcher.sh
#
# macOS App Translocation 대응:
#  다운로드 폴더에서 앱을 열면 런처만 /var/folders/.../AppTranslocation/ 으로
#  복사되어 옆의 엔진 앱이 안 보이는 문제가 생김 → 실제 엔진 경로를 탐색
set +e
export PATH="/usr/bin:/bin:/usr/sbin:/sbin:/opt/homebrew/bin:$PATH"

RES_DIR="$(cd "$(dirname "$0")" && pwd)"
APP_BUNDLE="$(cd "$RES_DIR/../.." && pwd)"   # …/워터마크 시작.app
LAUNCHER_PARENT="$(cd "$APP_BUNDLE/.." && pwd)"

ENGINE_NAME="BSD Watermark Studio.app"
ENGINE_BIN_REL="Contents/MacOS/BSD Watermark Studio"
PORT=8765
URL="http://127.0.0.1:${PORT}/"

# 로그는 엔진 위치를 알기 전엔 홈 쪽으로
EARLY_LOG="$HOME/Library/Logs/BSD-Watermark-Studio-launcher.log"
/bin/mkdir -p "$HOME/Library/Logs" 2>/dev/null

escape_as() {
  printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g'
}

ask() {
  local msg b1 b2 b3
  msg="$(escape_as "$1")"
  b1="$(escape_as "$2")"
  b2="$(escape_as "${3:-}")"
  b3="$(escape_as "${4:-}")"
  if [[ -n "${4:-}" ]]; then
    /usr/bin/osascript <<EOF 2>/dev/null
set r to button returned of (display dialog "${msg}" buttons {"${b1}", "${b2}", "${b3}"} default button 3 with icon caution with title "BSD Watermark Studio")
return r
EOF
  elif [[ -n "${3:-}" ]]; then
    /usr/bin/osascript <<EOF 2>/dev/null
set r to button returned of (display dialog "${msg}" buttons {"${b1}", "${b2}"} default button 2 with icon caution with title "BSD Watermark Studio")
return r
EOF
  else
    /usr/bin/osascript <<EOF 2>/dev/null
set r to button returned of (display dialog "${msg}" buttons {"${b1}"} default button 1 with icon stop with title "BSD Watermark Studio")
return r
EOF
  fi
}

notify() {
  local msg
  msg="$(escape_as "$1")"
  /usr/bin/osascript <<EOF >/dev/null 2>&1
display notification "${msg}" with title "BSD Watermark Studio"
EOF
}

log() {
  local line
  line="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
  printf '%s\n' "$line" >>"$EARLY_LOG" 2>/dev/null
  if [[ -n "${LOG_FILE:-}" ]]; then
    printf '%s\n' "$line" >>"$LOG_FILE" 2>/dev/null
  fi
}

is_translocated() {
  [[ "$1" == *"/AppTranslocation/"* ]]
}

has_engine_bin() {
  local app="$1"
  [[ -f "$app/$ENGINE_BIN_REL" ]] || [[ -x "$app/$ENGINE_BIN_REL" ]]
}

# 후보 경로 중 실제 엔진 선택 (AppTranslocation 제외, 최신 mtime 우선)
pick_engine() {
  local best="" best_mtime=0 cand mtime
  while IFS= read -r cand; do
    [[ -z "$cand" ]] && continue
    is_translocated "$cand" && continue
    has_engine_bin "$cand" || continue
    mtime=$(/usr/bin/stat -f %m "$cand" 2>/dev/null || echo 0)
    if [[ -z "$best" ]] || [[ "$mtime" -gt "$best_mtime" ]]; then
      best="$cand"
      best_mtime="$mtime"
    fi
  done
  printf '%s' "$best"
}

find_engine_app() {
  local found="" c
  local -a candidates=()

  # 1) 런처 옆 (Translocation 아닐 때)
  if ! is_translocated "$APP_BUNDLE"; then
    candidates+=("$LAUNCHER_PARENT/$ENGINE_NAME")
  fi

  # 2) 흔한 설치 위치
  candidates+=(
    "$HOME/Downloads/BSD-Watermark-Studio-Mac/$ENGINE_NAME"
    "$HOME/Downloads/$ENGINE_NAME"
    "$HOME/Desktop/BSD-Watermark-Studio-Mac/$ENGINE_NAME"
    "$HOME/Desktop/$ENGINE_NAME"
    "$HOME/Applications/$ENGINE_NAME"
    "/Applications/$ENGINE_NAME"
  )

  # Downloads 아래 1단계 폴더들
  if [[ -d "$HOME/Downloads" ]]; then
    while IFS= read -r c; do
      candidates+=("$c")
    done < <(/usr/bin/find "$HOME/Downloads" -maxdepth 3 -name "$ENGINE_NAME" -type d 2>/dev/null | /usr/bin/head -30)
  fi
  if [[ -d "$HOME/Desktop" ]]; then
    while IFS= read -r c; do
      candidates+=("$c")
    done < <(/usr/bin/find "$HOME/Desktop" -maxdepth 3 -name "$ENGINE_NAME" -type d 2>/dev/null | /usr/bin/head -20)
  fi

  # 3) Spotlight
  while IFS= read -r c; do
    candidates+=("$c")
  done < <(/usr/bin/mdfind "kMDItemFSName == '$ENGINE_NAME'" 2>/dev/null | /usr/bin/head -40)

  # 후보 출력 → pick
  found="$(printf '%s\n' "${candidates[@]}" | pick_engine)"
  if [[ -n "$found" ]]; then
    printf '%s' "$found"
    return 0
  fi
  return 1
}

server_up() {
  /usr/bin/curl -sf -o /dev/null --max-time 1 "$URL" 2>/dev/null
}

wait_server() {
  local n="${1:-25}" i
  for i in $(seq 1 "$n"); do
    server_up && return 0
    /bin/sleep 0.4
  done
  return 1
}

strip_quarantine() {
  /bin/chmod +x "$MAIN_BIN" 2>/dev/null || true
  /usr/bin/xattr -cr "$MAIN_APP" >/dev/null 2>&1 || true
  /usr/bin/xattr -cr "$APP_BUNDLE" >/dev/null 2>&1 || true
  /usr/bin/xattr -cr "$BASE" >/dev/null 2>&1 || true
  # 런처가 translocation 이면 원본 런처도 찾아서 해제 시도
  if is_translocated "$APP_BUNDLE"; then
    local real_launcher
    real_launcher="$(/usr/bin/mdfind "kMDItemFSName == '워터마크 시작.app'" 2>/dev/null | while read -r p; do
      is_translocated "$p" && continue
      echo "$p"
      break
    done)"
    if [[ -n "${real_launcher:-}" ]]; then
      /usr/bin/xattr -cr "$real_launcher" >/dev/null 2>&1 || true
      /usr/bin/xattr -cr "$(dirname "$real_launcher")" >/dev/null 2>&1 || true
    fi
  fi
}

open_security_settings() {
  /usr/bin/open "x-apple.systempreferences:com.apple.settings.PrivacySecurity.extension" 2>/dev/null \
    || /usr/bin/open "x-apple.systempreferences:com.apple.preference.security" 2>/dev/null \
    || /usr/bin/open "/System/Applications/System Settings.app" 2>/dev/null \
    || true
}

start_engine() {
  log "start: open '$MAIN_APP'"
  /usr/bin/open "$MAIN_APP" >>"$LOG_FILE" 2>&1
  log "open rc=$?"
  if wait_server 12; then
    return 0
  fi

  log "start: nohup binary"
  (
    cd "$BASE" 2>/dev/null || true
    /usr/bin/nohup "$MAIN_BIN" >>"$LOG_FILE" 2>&1 &
    echo $! >"$DATA_DIR/engine.pid" 2>/dev/null
  )
  if wait_server 20; then
    return 0
  fi
  return 1
}

show_first_run_help() {
  local choice
  choice="$(ask \
    "macOS 보안 때문에 최초 1회만 허용이 필요합니다.

【가장 쉬운 방법】
1. 「BSD Watermark Studio」앱 우클릭
2. 「열기」→ 다시 「열기」

【안 되면】
시스템 설정 → 개인정보 보호 및 보안
→ 「그래도 열기」

허용 후 「다시 실행」을 누르세요." \
    "보안 설정 열기" "다시 실행" "닫기")"

  case "$choice" in
    "보안 설정 열기")
      open_security_settings
      /usr/bin/open -R "$MAIN_APP" 2>/dev/null || /usr/bin/open "$BASE" 2>/dev/null || true
      choice2="$(ask "허용하셨다면 「다시 실행」을 누르세요." "다시 실행" "닫기")"
      [[ "$choice2" == "다시 실행" ]] && return 0
      return 1
      ;;
    "다시 실행") return 0 ;;
    *) return 1 ;;
  esac
}

# ── main ──────────────────────────────────────────
log "==== launcher start ===="
log "APP_BUNDLE=$APP_BUNDLE"
log "translocated=$(is_translocated "$APP_BUNDLE" && echo yes || echo no)"

MAIN_APP="$(find_engine_app)"
if [[ -z "$MAIN_APP" ]]; then
  log "engine NOT found"
  choice="$(ask \
    "엔진 앱(BSD Watermark Studio)을 찾지 못했습니다.

macOS가 앱을 임시 폴더로 옮기면(App Translocation)
옆 파일을 못 볼 수 있습니다.

【해결】
1. zip을 다시 풀어 폴더 전체를 만듭니다
2. 그 폴더 전체를 바탕화면 또는
   홈 → 응용 프로그램 으로 옮깁니다
3. 옮긴 곳에서 「워터마크 시작」을 실행

「다운로드 폴더 열기」로 이동할 수 있습니다." \
    "다운로드 폴더 열기" "확인")"
  if [[ "$choice" == "다운로드 폴더 열기" ]]; then
    /usr/bin/open "$HOME/Downloads" 2>/dev/null || true
  fi
  exit 0
fi

BASE="$(cd "$(dirname "$MAIN_APP")" && pwd)"
MAIN_BIN="$MAIN_APP/$ENGINE_BIN_REL"
DATA_DIR="$BASE/BSD-Watermark-Data"
LOG_FILE="$DATA_DIR/launch.log"
MARKER="$DATA_DIR/.gatekeeper-ok"

/bin/mkdir -p "$DATA_DIR" "$DATA_DIR/uploads" "$DATA_DIR/outputs" 2>/dev/null
log "MAIN_APP=$MAIN_APP"
log "BASE=$BASE"

if is_translocated "$APP_BUNDLE"; then
  log "NOTE: launcher was AppTranslocated; resolved engine on disk"
fi

strip_quarantine

if server_up; then
  /usr/bin/open "$URL" 2>/dev/null || true
  notify "이미 실행 중입니다. 브라우저를 확인하세요."
  /usr/bin/touch "$MARKER" 2>/dev/null || true
  exit 0
fi

PIDS=$(/usr/sbin/lsof -ti "tcp:${PORT}" 2>/dev/null)
if [[ -n "${PIDS:-}" ]]; then
  # shellcheck disable=SC2086
  /bin/kill -9 $PIDS 2>/dev/null || true
  /bin/sleep 0.3
fi

cd "$BASE" 2>/dev/null || true

if start_engine; then
  /usr/bin/touch "$MARKER" 2>/dev/null || true
  /usr/bin/open "$URL" 2>/dev/null || true
  notify "브라우저에서 PDF를 끌어다 놓으세요."
  log "ready OK"
  exit 0
fi

log "start failed — help UI"
for attempt in 1 2; do
  show_first_run_help || exit 0
  strip_quarantine
  PIDS=$(/usr/sbin/lsof -ti "tcp:${PORT}" 2>/dev/null)
  if [[ -n "${PIDS:-}" ]]; then
    # shellcheck disable=SC2086
    /bin/kill -9 $PIDS 2>/dev/null || true
    /bin/sleep 0.3
  fi
  if start_engine; then
    /usr/bin/touch "$MARKER" 2>/dev/null || true
    /usr/bin/open "$URL" 2>/dev/null || true
    notify "브라우저에서 PDF를 끌어다 놓으세요."
    log "ready OK after help attempt=$attempt"
    exit 0
  fi
done

ask "아직 서버가 열리지 않았습니다.

1) 「BSD Watermark Studio」우클릭 → 열기 → 열기
2) 시스템 설정 → 그래도 열기
3) 폴더 전체를 바탕화면으로 옮긴 뒤 다시 실행

로그: $LOG_FILE" "확인"
/usr/bin/open "$DATA_DIR" 2>/dev/null || true
exit 0
