#!/bin/bash
# Unity 프로젝트 SessionStart 자동 pull (2026-04-20 PD 옵션 A 승인)
#
# 역할: paths.local.json의 UNITY_PROJECT_ROOT 경로를 읽어 git pull --ff-only 수행
# 근거: C30 git 동기화 점검 의무 · 외부 저장소 Unity 프로젝트 자동 이행
# C34-12 Degraded 운영: 경로 미설정·레포 아님·pull 실패 시 경고만, 작업 차단 금지

set +e  # Degraded 운영 — 실패 시 exit 0 보장

# Lock 파일 (race 방지)
LOCK_FILE="$HOME/.claude/.burningtimes_unity_sync.lock"
LOCK_STALE_SECONDS=300  # 5분 이상 lock = stale

# Stale lock cleanup (trap 이전)
if [ -f "$LOCK_FILE" ]; then
  LOCK_MTIME=$(stat -c %Y "$LOCK_FILE" 2>/dev/null || stat -f %m "$LOCK_FILE" 2>/dev/null)
  NOW=$(date +%s)
  if [ -n "$LOCK_MTIME" ] && [ $((NOW - LOCK_MTIME)) -gt $LOCK_STALE_SECONDS ]; then
    rm -f "$LOCK_FILE" 2>/dev/null
    echo "ℹ️ [Unity sync] stale lock 제거 ($((NOW - LOCK_MTIME))s)"
  else
    echo "ℹ️ [Unity sync] 이미 진행 중 (lock 존재) — 스킵"
    exit 0
  fi
fi

# Lock 획득 + 종료 시 자동 제거 (trap)
touch "$LOCK_FILE"
trap 'rm -f "$LOCK_FILE" 2>/dev/null' EXIT

# paths.local.json 존재 확인
PATHS_FILE="paths.local.json"
if [ ! -f "$PATHS_FILE" ]; then
  echo "⚠️ [Unity sync] paths.local.json 부재 — template 복사 후 UNITY_PROJECT_ROOT 설정 필요"
  exit 0
fi

# UNITY_PROJECT_ROOT 추출 (jq 없으면 grep 대체)
if command -v jq >/dev/null 2>&1; then
  UNITY_ROOT=$(jq -r '.UNITY_PROJECT_ROOT // empty' "$PATHS_FILE" 2>/dev/null)
else
  UNITY_ROOT=$(grep -oP '"UNITY_PROJECT_ROOT"\s*:\s*"\K[^"]+' "$PATHS_FILE" 2>/dev/null)
fi

if [ -z "$UNITY_ROOT" ] || [ "$UNITY_ROOT" = "null" ]; then
  echo "⚠️ [Unity sync] UNITY_PROJECT_ROOT 미설정"
  exit 0
fi

# 경로 실체 확인
if [ ! -d "$UNITY_ROOT" ]; then
  echo "⚠️ [Unity sync] 경로 부재: $UNITY_ROOT"
  exit 0
fi

# git 레포 확인
if [ ! -d "$UNITY_ROOT/.git" ]; then
  echo "⚠️ [Unity sync] git 레포 아님: $UNITY_ROOT (C30 수동 점검 대상 외)"
  exit 0
fi

# fetch + pull --ff-only
cd "$UNITY_ROOT" || { echo "⚠️ [Unity sync] cd 실패"; exit 0; }

FETCH_OUT=$(git fetch origin 2>&1)
FETCH_EXIT=$?
if [ $FETCH_EXIT -ne 0 ]; then
  echo "⚠️ [Unity sync] fetch 실패 (network·인증 확인 필요)"
  echo "$FETCH_OUT" | head -3
  exit 0
fi

BEHIND=$(git rev-list --count HEAD..@{u} 2>/dev/null || echo "0")
if [ "$BEHIND" -gt 0 ]; then
  PULL_OUT=$(git pull --ff-only 2>&1)
  PULL_EXIT=$?
  if [ $PULL_EXIT -eq 0 ]; then
    echo "✅ [Unity sync] $BEHIND 커밋 pull 완료 — $UNITY_ROOT"
  else
    echo "⚠️ [Unity sync] pull 실패 (충돌·manual merge 필요): $UNITY_ROOT"
    echo "$PULL_OUT" | head -3
  fi
else
  echo "✅ [Unity sync] 최신 상태 — $UNITY_ROOT"
fi

exit 0
