#!/usr/bin/env bash
# backup-settings.sh — Claude settings.json 백업/복원 유틸리티
# 사용법:
#   backup-settings.sh               # 백업 생성 (기본 동작)
#   backup-settings.sh --list        # 백업 목록 조회
#   backup-settings.sh --restore <백업파일>  # 복원

set -euo pipefail

# ──────────────────────────────────────────────
# 상수 정의
# ──────────────────────────────────────────────
SETTINGS_FILE="/home/jay/.claude/settings.json"
SETTINGS_DIR="/home/jay/.claude"
BACKUP_PREFIX="settings.json.bak."

# ──────────────────────────────────────────────
# 공통 함수
# ──────────────────────────────────────────────
log_info()  { echo "[INFO]  $*"; }
log_ok()    { echo "[OK]    $*"; }
log_warn()  { echo "[WARN]  $*" >&2; }
log_error() { echo "[ERROR] $*" >&2; }

die() {
    log_error "$*"
    exit 1
}

# jq 존재 확인
require_jq() {
    command -v jq >/dev/null 2>&1 || die "jq 가 설치되어 있지 않습니다. 설치 후 재시도하세요. (apt install jq)"
}

# JSON 유효성 검증
validate_json() {
    local file="$1"
    if ! jq empty "$file" 2>/dev/null; then
        die "JSON 유효성 검증 실패: $file 은(는) 유효한 JSON이 아닙니다."
    fi
}

# ──────────────────────────────────────────────
# 기능: 백업 생성
# ──────────────────────────────────────────────
do_backup() {
    require_jq

    [[ -f "$SETTINGS_FILE" ]] || die "원본 파일이 없습니다: $SETTINGS_FILE"

    log_info "원본 파일 JSON 유효성 검증 중..."
    validate_json "$SETTINGS_FILE"
    log_ok "JSON 유효성 검증 통과."

    local timestamp
    timestamp=$(date +"%Y%m%d_%H%M%S")
    local backup_path="${SETTINGS_DIR}/${BACKUP_PREFIX}${timestamp}"

    cp "$SETTINGS_FILE" "$backup_path"
    log_ok "백업 완료: $backup_path"
}

# ──────────────────────────────────────────────
# 기능: 백업 목록 조회
# ──────────────────────────────────────────────
do_list() {
    local count=0
    echo "──────────────────────────────────────────────"
    echo " 백업 목록: ${SETTINGS_DIR}/${BACKUP_PREFIX}*"
    echo "──────────────────────────────────────────────"

    while IFS= read -r -d '' f; do
        local fname size mtime
        fname=$(basename "$f")
        size=$(du -h "$f" | cut -f1)
        mtime=$(date -r "$f" +"%Y-%m-%d %H:%M:%S" 2>/dev/null || stat -c "%y" "$f" | cut -d'.' -f1)
        printf "  %-50s  %6s  %s\n" "$fname" "$size" "$mtime"
        (( count++ )) || true
    done < <(find "$SETTINGS_DIR" -maxdepth 1 -name "${BACKUP_PREFIX}*" -print0 | sort -z)

    echo "──────────────────────────────────────────────"
    if [[ $count -eq 0 ]]; then
        log_warn "백업 파일이 없습니다."
    else
        log_info "총 ${count}개의 백업 파일."
    fi
}

# ──────────────────────────────────────────────
# 기능: 복원
# ──────────────────────────────────────────────
do_restore() {
    local backup_arg="${1:-}"
    require_jq

    [[ -n "$backup_arg" ]] || die "--restore 옵션에는 백업 파일명이 필요합니다.\n  예) backup-settings.sh --restore settings.json.bak.20260411_120000"

    # 절대 경로가 아니면 SETTINGS_DIR 기준으로 해석
    local backup_path
    if [[ "$backup_arg" == /* ]]; then
        backup_path="$backup_arg"
    else
        backup_path="${SETTINGS_DIR}/${backup_arg}"
    fi

    [[ -f "$backup_path" ]] || die "백업 파일을 찾을 수 없습니다: $backup_path"

    log_info "백업 파일 JSON 유효성 검증 중: $backup_path"
    validate_json "$backup_path"
    log_ok "JSON 유효성 검증 통과."

    # 복원 전 현재 파일을 자동 백업
    if [[ -f "$SETTINGS_FILE" ]]; then
        local pre_restore_ts
        pre_restore_ts=$(date +"%Y%m%d_%H%M%S")
        local pre_restore_backup="${SETTINGS_DIR}/${BACKUP_PREFIX}pre-restore_${pre_restore_ts}"
        cp "$SETTINGS_FILE" "$pre_restore_backup"
        log_info "복원 전 현재 파일을 안전 백업: $pre_restore_backup"
    fi

    cp "$backup_path" "$SETTINGS_FILE"
    log_ok "복원 완료: $backup_path → $SETTINGS_FILE"
}

# ──────────────────────────────────────────────
# 진입점 (메인)
# ──────────────────────────────────────────────
main() {
    local cmd="${1:-backup}"

    case "$cmd" in
        --list)
            do_list
            ;;
        --restore)
            do_restore "${2:-}"
            ;;
        backup|"")
            do_backup
            ;;
        --help|-h)
            cat <<'USAGE'
사용법:
  backup-settings.sh                                    # settings.json 백업 생성
  backup-settings.sh --list                             # 백업 목록 조회
  backup-settings.sh --restore <백업파일명 또는 경로>   # 지정 백업으로 복원

예시:
  backup-settings.sh
  backup-settings.sh --list
  backup-settings.sh --restore settings.json.bak.20260411_120000
USAGE
            ;;
        *)
            die "알 수 없는 옵션: $cmd\n'backup-settings.sh --help' 로 사용법을 확인하세요."
            ;;
    esac
}

main "$@"
