#!/usr/bin/env bash
# TalkOne 한 줄 설치 — macOS / Linux.
#
# Usage:
#   curl -fsSL <release-url>/install.sh | sh
#   또는 env 로 server 지정:
#   TALKONE_RELEASE_URL=http://my-server:4935/talkone-releases curl ... | sh
#
# 환경:
#   TALKONE_RELEASE_URL — release artifacts 호스팅 base URL (기본: 127.0.0.1:4935 — 변경 필요)
#   TALKONE_CHANNEL     — latest|beta (기본: latest)
set -euo pipefail

RELEASE_URL="${TALKONE_RELEASE_URL:-http://127.0.0.1:4935/talkone-releases}"
CHANNEL="${TALKONE_CHANNEL:-latest}"

# 색상
if [ -t 1 ]; then
  R=$'\033[31m'; G=$'\033[32m'; Y=$'\033[33m'; B=$'\033[34m'; C=$'\033[36m'; N=$'\033[0m'
else
  R=''; G=''; Y=''; B=''; C=''; N=''
fi

log()  { printf '%s%s%s\n' "$C" "$*" "$N"; }
ok()   { printf '%s✓ %s%s\n' "$G" "$*" "$N"; }
warn() { printf '%s⚠ %s%s\n' "$Y" "$*" "$N" >&2; }
die()  { printf '%s✗ %s%s\n' "$R" "$*" "$N" >&2; exit 1; }

OS=$(uname -s)
ARCH=$(uname -m)

case "$OS" in
  Darwin) PLATFORM=mac ;;
  Linux)  PLATFORM=linux ;;
  *)      die "지원 안 하는 OS: $OS (macOS/Linux 만 지원, Windows 는 install.ps1)" ;;
esac

case "$ARCH" in
  arm64|aarch64) ARCH_TAG=arm64 ;;
  x86_64|amd64)  ARCH_TAG=x64 ;;
  *) die "지원 안 하는 architecture: $ARCH" ;;
esac

log "🔍 TalkOne 설치 — $OS / $ARCH"
log "   release URL: $RELEASE_URL"
log "   channel:     $CHANNEL"

# manifest 이름
case "$PLATFORM" in
  mac)   YML_NAME="${CHANNEL}-mac.yml" ;;
  linux) YML_NAME="${CHANNEL}-linux.yml" ;;
esac

TMP=$(mktemp -d -t talkone-install.XXXXXX)
trap 'rm -rf "$TMP"' EXIT

# 1) manifest 다운로드
log "📥 manifest 받는 중 — $YML_NAME"
if ! curl -fsSL "$RELEASE_URL/$YML_NAME" -o "$TMP/manifest.yml"; then
  die "manifest 다운로드 실패. URL 확인: $RELEASE_URL/$YML_NAME"
fi

VERSION=$(awk -F': ' '/^version:/ {print $2; exit}' "$TMP/manifest.yml" | tr -d '\r')
[ -n "$VERSION" ] || die "manifest 파싱 실패 — version 없음"

# `path:` 가 universal/x64/arm64 등 — platform 별 적절히 선택
PKG_PATH=""
case "$PLATFORM" in
  mac)
    # mac 은 보통 universal dmg + zip. dmg 우선.
    PKG_PATH=$(awk -F'[ :]+' '/url:/ {print $2}' "$TMP/manifest.yml" | grep -E '\.dmg$' | head -1 || true)
    [ -z "$PKG_PATH" ] && PKG_PATH=$(awk -F'[ :]+' '/url:/ {print $2}' "$TMP/manifest.yml" | grep -E '\.zip$' | head -1 || true)
    [ -z "$PKG_PATH" ] && PKG_PATH=$(awk -F'[ :]+' '/^path:/ {print $2}' "$TMP/manifest.yml" | head -1 || true)
    ;;
  linux)
    # arch 별 매칭 — x64 우선, 없으면 universal
    PKG_PATH=$(awk -F'[ :]+' '/url:/ {print $2}' "$TMP/manifest.yml" | grep -E "${ARCH_TAG}\.AppImage$" | head -1 || true)
    [ -z "$PKG_PATH" ] && PKG_PATH=$(awk -F'[ :]+' '/url:/ {print $2}' "$TMP/manifest.yml" | grep -E '\.AppImage$' | head -1 || true)
    [ -z "$PKG_PATH" ] && PKG_PATH=$(awk -F'[ :]+' '/^path:/ {print $2}' "$TMP/manifest.yml" | head -1 || true)
    ;;
esac
PKG_PATH=$(echo "$PKG_PATH" | tr -d '\r')
[ -n "$PKG_PATH" ] || die "manifest 파싱 실패 — 패키지 path 없음"

log "📦 TalkOne $VERSION — $PKG_PATH"

# 2) 패키지 다운로드
PKG_URL="$RELEASE_URL/$PKG_PATH"
PKG_FILE="$TMP/$(basename "$PKG_PATH")"
log "📥 다운로드 — $PKG_URL"
if ! curl -fL -# "$PKG_URL" -o "$PKG_FILE"; then
  die "패키지 다운로드 실패"
fi

# 3) 무결성 검증 — manifest 의 sha512 (electron-builder 형식)
EXPECTED_SHA512=$(awk '/^[[:space:]]*sha512:/ {print $2; exit}' "$TMP/manifest.yml" | tr -d '\r')
if [ -n "$EXPECTED_SHA512" ] && command -v shasum >/dev/null 2>&1; then
  ACTUAL_SHA512=$(shasum -a 512 "$PKG_FILE" | awk '{print $1}' | xxd -r -p | base64)
  if [ "$ACTUAL_SHA512" = "$EXPECTED_SHA512" ]; then
    ok "체크섬 일치 (sha512)"
  else
    warn "체크섬 불일치 — 계속 진행 (CDN/proxy 영향 가능)"
  fi
fi

# 4) 설치 — 플랫폼 별
case "$PLATFORM" in
  mac)
    if [[ "$PKG_FILE" == *.dmg ]]; then
      log "💿 DMG 마운트"
      MOUNT_OUT=$(hdiutil attach -nobrowse -readonly "$PKG_FILE" 2>&1) || die "DMG 마운트 실패"
      MOUNT_DIR=$(echo "$MOUNT_OUT" | awk -F '\t' '/\/Volumes\// {print $NF; exit}')
      [ -d "$MOUNT_DIR" ] || die "마운트 디렉토리 못 찾음"
      APP_SRC=$(find "$MOUNT_DIR" -maxdepth 2 -name "*.app" | head -1)
      [ -n "$APP_SRC" ] || { hdiutil detach "$MOUNT_DIR" >/dev/null 2>&1; die ".app 못 찾음"; }
    elif [[ "$PKG_FILE" == *.zip ]]; then
      log "📦 ZIP 해제"
      mkdir -p "$TMP/extracted"
      ditto -x -k "$PKG_FILE" "$TMP/extracted" || die "ZIP 해제 실패"
      APP_SRC=$(find "$TMP/extracted" -maxdepth 2 -name "*.app" | head -1)
      [ -n "$APP_SRC" ] || die ".app 못 찾음"
    fi

    DEST="/Applications/TalkOne.app"
    if [ -d "$DEST" ]; then
      # 실행 중이면 종료 시도
      pkill -f "$DEST/Contents/MacOS/TalkOne" 2>/dev/null || true
      sleep 1
      log "🗑  기존 설치 제거"
      rm -rf "$DEST" 2>/dev/null || sudo rm -rf "$DEST"
    fi

    log "📂 /Applications 로 복사"
    cp -R "$APP_SRC" /Applications/ 2>/dev/null || sudo cp -R "$APP_SRC" /Applications/

    # Gatekeeper quarantine 제거 — 코드 사인 없는 경우 "신원 미확인 개발자" 경고 방지
    xattr -dr com.apple.quarantine "$DEST" 2>/dev/null || true

    if [ -n "${MOUNT_DIR:-}" ]; then
      hdiutil detach "$MOUNT_DIR" >/dev/null 2>&1 || true
    fi

    ok "TalkOne $VERSION 설치 완료"
    log "🚀 실행 — open $DEST"
    open "$DEST" 2>/dev/null || true
    ;;

  linux)
    DEST_DIR="$HOME/.local/bin"
    mkdir -p "$DEST_DIR"

    if [[ "$PKG_FILE" == *.AppImage ]]; then
      DEST="$DEST_DIR/TalkOne.AppImage"
      cp "$PKG_FILE" "$DEST"
      chmod +x "$DEST"

      # desktop entry
      mkdir -p "$HOME/.local/share/applications"
      cat > "$HOME/.local/share/applications/talkone.desktop" <<EOF
[Desktop Entry]
Type=Application
Name=TalkOne
Exec=$DEST
Icon=talkone
Categories=Network;Office;
StartupNotify=true
EOF
      ok "TalkOne $VERSION 설치 완료 — $DEST"
      log "🚀 실행 — $DEST &"

    elif [[ "$PKG_FILE" == *.deb ]]; then
      if command -v apt >/dev/null 2>&1; then
        sudo apt install -y "$PKG_FILE"
      else
        sudo dpkg -i "$PKG_FILE" || sudo apt-get install -f -y
      fi
      ok "TalkOne $VERSION 설치 완료 (deb)"
    else
      die "지원 안 하는 패키지 형식: $PKG_FILE"
    fi
    ;;
esac
