#!/usr/bin/env bash
# ════════════════════════════════════════════════════════════════
#  Azing TEST Analyzer v2.0.0 — macOS ARM64 원클릭 설치 스크립트
#  지원 환경: macOS Monterey 12+ / Apple Silicon (M1/M2/M3/M4)
#
#  사용법:
#    터미널에서 실행:
#    bash ~/Downloads/Azing_TEST_Analyzer_v2.0.0_arm64.sh
# ════════════════════════════════════════════════════════════════
set -euo pipefail

# ── 상수 정의 ──────────────────────────────────────────────────
APP_NAME="Azing TEST Analyzer"
APP_VERSION="2.0.0"
APP_SUPPORT="/Library/Application Support/$APP_NAME"
APP_BUNDLE="/Applications/$APP_NAME.app"
LAUNCH_SCRIPT="$APP_SUPPORT/server_launcher.sh"
LOG_DIR="$HOME/Library/Logs/AzingTESTAnalyzer"
LOG_FILE="$LOG_DIR/install.log"
SETUP_FLAG="$HOME/.azing_setup_done_v2"

SOURCE_ZIP_URL="https://pub-0ce9367daf8f4c48afeb0df1d6c97ae5.r2.dev/Azing_TEST_Analyzer_v2.0.0_source.zip"
TEMP_DIR="$(mktemp -d)"

# ── 색상 ───────────────────────────────────────────────────────
RED='\033[0;31m'; GREEN='\033[0;32m'; CYAN='\033[0;36m'
YELLOW='\033[1;33m'; BOLD='\033[1m'; NC='\033[0m'

mkdir -p "$LOG_DIR"

ts()       { date +%H:%M:%S; }
write_log(){ echo "[$(ts)] $1" | tee -a "$LOG_FILE"; }
log_step() { echo ""; echo -e "${CYAN}${BOLD}[$(ts)] $1${NC}"; write_log "STEP: $1"; }
log_ok()   { echo -e "  ${GREEN}[OK]${NC}  $1"; write_log "OK: $1"; }
log_warn() { echo -e "  ${YELLOW}[!]${NC}   $1"; write_log "WARN: $1"; }
log_fail() { echo -e "  ${RED}[X]${NC}   $1"; write_log "FAIL: $1"; echo ""; exit 1; }

cleanup() { rm -rf "$TEMP_DIR" 2>/dev/null || true; }
trap cleanup EXIT

# ── 헤더 ───────────────────────────────────────────────────────
clear
echo ""
echo -e "${CYAN}${BOLD}═══════════════════════════════════════════════════════${NC}"
echo -e "${CYAN}${BOLD}   📹  Azing TEST Analyzer v${APP_VERSION} — macOS 설치${NC}"
echo -e "${CYAN}${BOLD}   AI 기반 영상 품질 자동 검사 시스템${NC}"
echo -e "${CYAN}${BOLD}═══════════════════════════════════════════════════════${NC}"
echo -e "   로그: ${YELLOW}$LOG_FILE${NC}"
echo ""

# ── 0. 환경 확인 ──────────────────────────────────────────────
log_step "0/7  환경 확인..."

# macOS 확인
OS="$(uname -s)"
if [ "$OS" != "Darwin" ]; then
    log_fail "이 스크립트는 macOS 전용입니다. (현재: $OS)"
fi

# Apple Silicon 확인
ARCH="$(uname -m)"
if [ "$ARCH" != "arm64" ]; then
    log_warn "현재 아키텍처: $ARCH (arm64 권장). Intel Mac에서도 동작합니다."
fi

# macOS 버전 확인
MACOS_VER=$(sw_vers -productVersion 2>/dev/null || echo "0.0")
MACOS_MAJOR=$(echo "$MACOS_VER" | cut -d. -f1)
if [ "${MACOS_MAJOR:-0}" -lt 12 ]; then
    log_warn "macOS $MACOS_VER 감지. Monterey(12.0) 이상을 권장합니다."
fi

log_ok "macOS $MACOS_VER / $ARCH"

# 관리자 권한 확인 (APP_SUPPORT가 /Library/... 이므로 sudo 필요)
if [ "$EUID" -ne 0 ]; then
    echo ""
    echo -e "  ${YELLOW}/Library/Application Support 에 설치하려면 관리자 암호가 필요합니다.${NC}"
    echo ""
    sudo -v || log_fail "관리자 권한이 필요합니다. sudo 권한을 가진 계정으로 실행하세요."
    # sudo 세션 유지 (백그라운드)
    while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &
fi

# ── 1. 앱 소스 다운로드 ───────────────────────────────────────
log_step "1/7  앱 소스 다운로드..."

ZIP_PATH="$TEMP_DIR/source.zip"
echo "  URL: $SOURCE_ZIP_URL"
echo "  저장: $ZIP_PATH"

if ! curl -L --progress-bar --fail -o "$ZIP_PATH" "$SOURCE_ZIP_URL"; then
    log_fail "다운로드 실패. 인터넷 연결을 확인하세요."
fi

log_ok "다운로드 완료: $(du -sh "$ZIP_PATH" | cut -f1)"

# ── 2. 앱 파일 설치 ───────────────────────────────────────────
log_step "2/7  앱 파일 설치..."

# 기존 실행 중인 서버 종료
pkill -f "run.py"    2>/dev/null || true
pkill -f "server.py" 2>/dev/null || true
pkill -f "uvicorn"   2>/dev/null || true

# 설치 디렉토리 생성 (sudo 필요)
sudo mkdir -p "$APP_SUPPORT/uploads"
sudo mkdir -p "$APP_SUPPORT/results"
sudo mkdir -p "$APP_SUPPORT/static"

# 압축 해제
EXTRACT_DIR="$TEMP_DIR/extracted"
mkdir -p "$EXTRACT_DIR"
unzip -q "$ZIP_PATH" -d "$EXTRACT_DIR"

# 압축 내 최상위 폴더 자동 감지
TOP_DIR=$(ls "$EXTRACT_DIR" | head -1)
if [ -d "$EXTRACT_DIR/$TOP_DIR" ] && [ "$(ls "$EXTRACT_DIR" | wc -l)" -eq 1 ]; then
    SRC="$EXTRACT_DIR/$TOP_DIR"
else
    SRC="$EXTRACT_DIR"
fi

# 파일 복사
sudo cp -R "$SRC/." "$APP_SUPPORT/"
log_ok "앱 파일 설치: $APP_SUPPORT"

# 권한 설정
sudo chmod 777 "$APP_SUPPORT/uploads"
sudo chmod 777 "$APP_SUPPORT/results"
sudo find "$APP_SUPPORT" -name "*.sh" -exec chmod +x {} \; 2>/dev/null || true
sudo chmod 666 "$APP_SUPPORT/.env" 2>/dev/null || true

# quarantine 속성 제거
sudo xattr -r -d com.apple.quarantine "$APP_SUPPORT" 2>/dev/null || true

log_ok "권한 설정 완료"

# ── 3. Homebrew ───────────────────────────────────────────────
log_step "3/7  Homebrew 확인..."

export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/local/sbin:$PATH"

BREW_CMD=""
for b in "/opt/homebrew/bin/brew" "/usr/local/bin/brew" "$(command -v brew 2>/dev/null || true)"; do
    [ -x "$b" ] && BREW_CMD="$b" && break
done

if [ -n "$BREW_CMD" ]; then
    log_ok "Homebrew: $("$BREW_CMD" --version | head -1)  ($BREW_CMD)"
else
    log_warn "Homebrew 없음 — 설치 중..."
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 2>&1 | \
        while IFS= read -r line; do write_log "brew-install: $line"; done
    for b in "/opt/homebrew/bin/brew" "/usr/local/bin/brew"; do
        [ -x "$b" ] && BREW_CMD="$b" && break
    done
    [ -n "$BREW_CMD" ] && export PATH="$(dirname "$BREW_CMD"):$PATH" && log_ok "Homebrew 설치 완료" \
        || log_fail "Homebrew 설치 실패. 수동 설치: https://brew.sh"
fi

# ── 4. Python ─────────────────────────────────────────────────
log_step "4/7  Python 확인..."

find_python() {
    for p in "/opt/homebrew/bin/python3.11" "/opt/homebrew/bin/python3.12" \
              "/opt/homebrew/bin/python3.10" "/opt/homebrew/bin/python3" \
              "/usr/local/bin/python3.11"    "/usr/local/bin/python3" \
              "$(command -v python3 2>/dev/null || true)"; do
        [ -x "$p" ] || continue
        ver=$("$p" --version 2>&1 | grep -oE "3\.(1[0-9]|[2-9][0-9])" || true)
        [ -n "$ver" ] && echo "$p" && return 0
    done
    return 1
}

PYTHON_CMD="$(find_python || true)"
if [ -n "$PYTHON_CMD" ]; then
    log_ok "Python: $("$PYTHON_CMD" --version)  ($PYTHON_CMD)"
else
    log_warn "Python 없음 — Homebrew로 설치 중..."
    "$BREW_CMD" install python@3.11 2>&1 | while IFS= read -r l; do write_log "brew-python: $l"; done
    PYTHON_CMD="$(find_python || true)"
    [ -n "$PYTHON_CMD" ] && log_ok "Python 설치 완료" \
        || log_fail "Python 설치 실패. 수동: brew install python@3.11"
fi

# pip 패키지 설치
echo "  pip 패키지 설치 중... (2~5분 소요)"
"$PYTHON_CMD" -m pip install --upgrade pip --quiet 2>&1 | tail -1
PIP_OK=false
for attempt in 1 2 3; do
    if "$PYTHON_CMD" -m pip install \
        -r "$APP_SUPPORT/requirements.txt" \
        --upgrade --no-warn-script-location --quiet 2>&1 | \
        while IFS= read -r l; do write_log "pip: $l"; done; then
        PIP_OK=true; break
    fi
    log_warn "pip 실패 ($attempt/3). 재시도..."
    sleep 2
done
$PIP_OK && log_ok "pip 패키지 설치 완료" || log_warn "pip 실패 — 서버 시작 시 재시도됩니다."

# ── 5. FFmpeg ─────────────────────────────────────────────────
log_step "5/7  FFmpeg 확인..."

find_ffmpeg() {
    for p in "/opt/homebrew/bin/ffmpeg" "/usr/local/bin/ffmpeg" \
              "$(command -v ffmpeg 2>/dev/null || true)"; do
        [ -x "$p" ] && "$p" -version &>/dev/null && echo "$p" && return 0
    done
    return 1
}

FFMPEG_CMD="$(find_ffmpeg || true)"
if [ -n "$FFMPEG_CMD" ]; then
    FF_VER=$("$FFMPEG_CMD" -version 2>&1 | head -1 | awk '{print $3}')
    log_ok "FFmpeg $FF_VER  ($FFMPEG_CMD)"
else
    log_warn "FFmpeg 없음 — Homebrew로 설치 중..."
    "$BREW_CMD" install ffmpeg 2>&1 | while IFS= read -r l; do write_log "brew-ffmpeg: $l"; done
    FFMPEG_CMD="$(find_ffmpeg || true)"
    [ -n "$FFMPEG_CMD" ] && log_ok "FFmpeg 설치 완료" || log_warn "FFmpeg 설치 실패. 수동: brew install ffmpeg"
fi

# ── 6. Ollama (선택) ──────────────────────────────────────────
log_step "6/7  Ollama AI 엔진 설치 (선택사항)..."

echo ""
echo -e "  ${BOLD}AI 분석 엔진 (Ollama) — 로컬 실행, 데이터 외부 전송 없음${NC}"
echo ""
echo "  [1] gemma4:12b  표준 품질, ~8GB  (권장)"
echo "  [2] gemma4:27b  최고 품질, ~17GB"
echo "  [3] gemma3:4b   빠른 분석, ~2.3GB"
echo "  [4] 나중에 설치  (Ollama 없이 진행)"
echo ""
read -rp "  선택 [1~4, 기본값 1]: " OLLAMA_CHOICE
OLLAMA_CHOICE="${OLLAMA_CHOICE:-1}"

OLLAMA_MODEL=""
case "$OLLAMA_CHOICE" in
    2) OLLAMA_MODEL="gemma4:27b" ;;
    3) OLLAMA_MODEL="gemma3:4b"  ;;
    4) OLLAMA_MODEL=""           ;;
    *) OLLAMA_MODEL="gemma4:12b" ;;
esac

if [ -n "$OLLAMA_MODEL" ]; then
    OLLAMA_SCRIPT="$APP_SUPPORT/install_ollama.sh"
    if [ -f "$OLLAMA_SCRIPT" ]; then
        bash "$OLLAMA_SCRIPT" "$OLLAMA_MODEL"
    fi
else
    log_ok "Ollama 설치 건너뜀"
fi

# ── 7. .app 번들 + 런처 생성 ──────────────────────────────────
log_step "7/7  앱 번들 생성..."

# server_launcher.sh 보안 속성 제거
sudo xattr -d com.apple.quarantine "$LAUNCH_SCRIPT" 2>/dev/null || true
sudo chmod +x "$LAUNCH_SCRIPT"

# .app 번들 생성
MACOS_DIR="$APP_BUNDLE/Contents/MacOS"
sudo mkdir -p "$MACOS_DIR"
sudo mkdir -p "$APP_BUNDLE/Contents/Resources"

# Info.plist 생성
sudo tee "$APP_BUNDLE/Contents/Info.plist" > /dev/null <<'PLIST'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleIdentifier</key>
    <string>com.kaongroup.azing-test-analyzer</string>
    <key>CFBundleName</key>
    <string>Azing TEST Analyzer</string>
    <key>CFBundleDisplayName</key>
    <string>Azing TEST Analyzer</string>
    <key>CFBundleExecutable</key>
    <string>AzingTESTAnalyzer</string>
    <key>CFBundleShortVersionString</key>
    <string>2.0.0</string>
    <key>CFBundleVersion</key>
    <string>2.0.0</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>LSMinimumSystemVersion</key>
    <string>12.0</string>
    <key>NSHighResolutionCapable</key>
    <true/>
    <key>LSUIElement</key>
    <false/>
    <key>NSHumanReadableCopyright</key>
    <string>Copyright © 2025-2026 Kaon Group QA</string>
    <key>LSArchitecturePriority</key>
    <array>
        <string>arm64</string>
        <string>x86_64</string>
    </array>
</dict>
</plist>
PLIST

# 앱 런처 실행 파일 생성
APP_SUPPORT_ESCAPED=$(printf '%s' "$APP_SUPPORT" | sed 's/[\/&]/\\&/g')
sudo tee "$MACOS_DIR/AzingTESTAnalyzer" > /dev/null <<LAUNCHER
#!/usr/bin/env bash
APP_SUPPORT="/Library/Application Support/Azing TEST Analyzer"
SERVER_SCRIPT="\$APP_SUPPORT/server_launcher.sh"
if lsof -i :7777 &>/dev/null 2>&1; then
    osascript -e 'tell application "Safari" to open location "http://localhost:7777"' 2>/dev/null || \
    open "http://localhost:7777"
    exit 0
fi
if [ ! -f "\$SERVER_SCRIPT" ]; then
    osascript -e 'display alert "Azing TEST Analyzer" message "설치 파일이 손상되었습니다.\n재설치: Azing_TEST_Analyzer_v2.0.0_arm64.sh" as critical buttons {"확인"} default button "확인"'
    exit 1
fi
chmod +x "\$SERVER_SCRIPT"
osascript <<APPLESCRIPT
tell application "Terminal"
    do script "bash '\$SERVER_SCRIPT'"
    activate
end tell
APPLESCRIPT
LAUNCHER

sudo chmod +x "$MACOS_DIR/AzingTESTAnalyzer"
sudo xattr -r -d com.apple.quarantine "$APP_BUNDLE" 2>/dev/null || true

log_ok ".app 번들 생성: $APP_BUNDLE"

# setup 플래그 기록
echo "PYTHON=$PYTHON_CMD"        > "$SETUP_FLAG"
echo "FFMPEG=${FFMPEG_CMD:-}"   >> "$SETUP_FLAG"
echo "DATE=$(date)"             >> "$SETUP_FLAG"

# PATH 영속 설정
BREW_PATH_LINE='export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:$PATH"'
for profile in "$HOME/.zshrc" "$HOME/.bash_profile" "$HOME/.profile"; do
    if [ -f "$profile" ] && ! grep -q "/opt/homebrew/bin" "$profile" 2>/dev/null; then
        { echo ""; echo "# Homebrew (Azing TEST Analyzer)"; echo "$BREW_PATH_LINE"; } >> "$profile"
        break
    fi
done

# ── 설치 완료 ─────────────────────────────────────────────────
echo ""
echo -e "${GREEN}${BOLD}═══════════════════════════════════════════════════════${NC}"
echo -e "${GREEN}${BOLD}   ✅  설치 완료!${NC}"
echo -e "${GREEN}${BOLD}═══════════════════════════════════════════════════════${NC}"
echo ""
echo -e "  ${BOLD}앱 실행 방법:${NC}"
echo -e "  ${CYAN}▶  Launchpad 또는 응용 프로그램 폴더에서 \"Azing TEST Analyzer\" 실행${NC}"
echo ""
echo -e "  ${BOLD}설치 경로:${NC}  $APP_SUPPORT"
echo -e "  ${BOLD}앱 번들:${NC}    $APP_BUNDLE"
echo -e "  ${BOLD}로그:${NC}       $LOG_FILE"
echo ""
echo -e "  ${BOLD}브라우저 주소:${NC}  http://localhost:7777"
echo ""

# 앱 바로 실행 여부 묻기
read -rp "  지금 Azing TEST Analyzer를 실행할까요? [Y/n]: " LAUNCH_NOW
LAUNCH_NOW="${LAUNCH_NOW:-Y}"
if [[ "$LAUNCH_NOW" =~ ^[Yy]$ ]]; then
    echo ""
    echo "  서버를 시작합니다..."
    open -a "$APP_NAME" 2>/dev/null || bash "$LAUNCH_SCRIPT"
fi

echo ""
