#!/bin/bash
# ===================================================================
# TK Factory Services - 원격 롤백 스크립트 (맥북에서 실행)
# ===================================================================
# 사용법: ./scripts/rollback-remote.sh <commit-hash>
# 설정:   ~/.tk-deploy-config
# ===================================================================

set -e

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
CONFIG_FILE="$HOME/.tk-deploy-config"

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

# === 인자 확인 ===
TARGET_HASH="${1:-}"
if [ -z "$TARGET_HASH" ]; then
  echo "사용법: ./scripts/rollback-remote.sh <commit-hash>"
  echo ""
  echo "예시:"
  echo "  ./scripts/rollback-remote.sh abc1234"
  echo "  ./scripts/rollback-remote.sh abc1234567890"
  echo ""
  echo "최근 커밋 목록:"
  cd "$(dirname "$0")/.."
  git log --oneline -10
  exit 1
fi

# === 설정 로드 ===
if [ ! -f "$CONFIG_FILE" ]; then
  echo -e "${RED}ERROR: 설정 파일이 없습니다: $CONFIG_FILE${NC}"
  exit 1
fi

source "$CONFIG_FILE"

for var in NAS_HOST NAS_USER NAS_DEPLOY_PATH NAS_SUDO_PASS; do
  if [ -z "${!var}" ]; then
    echo -e "${RED}ERROR: $CONFIG_FILE에 $var 가 설정되지 않았습니다${NC}"
    exit 1
  fi
done

DOCKER="/usr/local/bin/docker"

ssh_cmd() {
  ssh -o ConnectTimeout=10 "${NAS_USER}@${NAS_HOST}" "$@"
}

nas_docker() {
  ssh_cmd "cd ${NAS_DEPLOY_PATH} && echo '${NAS_SUDO_PASS}' | sudo -S ${DOCKER} $*" 2>&1
}

# === 커밋 유효성 확인 ===
cd "$PROJECT_DIR"

FULL_HASH=$(git rev-parse "$TARGET_HASH" 2>/dev/null || echo "")
if [ -z "$FULL_HASH" ]; then
  echo -e "${RED}ERROR: 유효하지 않은 커밋 해시입니다: ${TARGET_HASH}${NC}"
  exit 1
fi

TARGET_SHORT="${FULL_HASH:0:7}"
TARGET_MSG=$(git log -1 --format='%s' "$FULL_HASH")
TARGET_DATE=$(git log -1 --format='%ci' "$FULL_HASH")

# === 현재 NAS 상태 확인 ===
echo "=== TK Factory Services - 원격 롤백 ==="
echo ""

NAS_HASH=$(ssh_cmd "cd ${NAS_DEPLOY_PATH} && git log -1 --format='%H'" 2>/dev/null || echo "")
NAS_SHORT="${NAS_HASH:0:7}"
NAS_MSG=$(ssh_cmd "cd ${NAS_DEPLOY_PATH} && git log -1 --format='%s'" 2>/dev/null)

echo -e "  NAS 현재:  ${YELLOW}${NAS_SHORT}${NC} - ${NAS_MSG}"
echo -e "  롤백 대상: ${CYAN}${TARGET_SHORT}${NC} - ${TARGET_MSG}"
echo -e "  커밋 날짜: ${TARGET_DATE}"

if [ "$FULL_HASH" = "$NAS_HASH" ]; then
  echo ""
  echo -e "${GREEN}이미 해당 버전입니다.${NC}"
  exit 0
fi

echo ""
read -p "롤백을 진행하시겠습니까? [y/N] " confirm
if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
  echo "롤백이 취소되었습니다."
  exit 0
fi

# === 롤백 실행 ===
echo ""
echo -e "${CYAN}[1/3] NAS 코드 롤백${NC}"

ssh_cmd "cd ${NAS_DEPLOY_PATH} && git fetch origin && git checkout ${FULL_HASH}"

echo -e "  ${GREEN}완료${NC}"

echo ""
echo -e "${CYAN}[2/3] Docker 컨테이너 재빌드${NC}"
echo "  (빌드에 시간이 걸릴 수 있습니다...)"
echo ""

nas_docker "compose up -d --build"

echo ""
echo "  nginx 프록시 컨테이너 재시작..."
nas_docker "restart tk-gateway tk-system2-web tk-system3-web"

echo ""
echo -e "${CYAN}[3/3] 배포 검증${NC} (15초 대기)"
sleep 15

echo ""
echo "=== Container Status ==="
nas_docker "compose ps --format 'table {{.Name}}\t{{.Status}}'" || true

# 배포 로그 기록
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
ssh_cmd "echo '${TIMESTAMP} | ${TARGET_SHORT} | ROLLBACK: ${TARGET_MSG}' >> ${NAS_DEPLOY_PATH}/DEPLOY_LOG"

echo ""
echo -e "${GREEN}롤백 완료!${NC}"
echo "  버전: ${TARGET_SHORT} - ${TARGET_MSG}"
echo ""
echo -e "${YELLOW}주의: NAS가 detached HEAD 상태입니다.${NC}"
echo "  다음 정상 배포 시 자동으로 main 브랜치로 복귀합니다."
