#!/usr/bin/env bash
# 맥미니에서 학습한 모델을 LXC 컨테이너 볼륨 경로로 전송한다.
# 사용법: bash scripts/deploy_model.sh [lgbm|mlx] [--symbol TRXUSDT]
#
# 예시:
#   bash scripts/deploy_model.sh                    # LightGBM (기본값), models/ 루트
#   bash scripts/deploy_model.sh mlx                # MLX 신경망, models/ 루트
#   bash scripts/deploy_model.sh --symbol TRXUSDT   # LightGBM, models/trxusdt/
#   bash scripts/deploy_model.sh mlx --symbol XRPUSDT  # MLX, models/xrpusdt/

set -euo pipefail

# ── 인자 파싱 ────────────────────────────────────────────────────────────────
BACKEND="lgbm"
SYMBOL_ARG=""

while [[ $# -gt 0 ]]; do
    case "$1" in
        --symbol)
            SYMBOL_ARG="$2"
            shift 2
            ;;
        mlx|lgbm)
            BACKEND="$1"
            shift
            ;;
        *)
            shift
            ;;
    esac
done

LXC_HOST="root@10.1.10.24"
LXC_MODELS_PATH="/root/cointrader/models"

# ── 심볼별 경로 결정 ─────────────────────────────────────────────────────────
if [ -n "$SYMBOL_ARG" ]; then
    SYM_LOWER=$(echo "$SYMBOL_ARG" | tr '[:upper:]' '[:lower:]')
    LOCAL_MODEL_DIR="models/$SYM_LOWER"
    REMOTE_MODEL_DIR="$LXC_MODELS_PATH/$SYM_LOWER"
    LOCAL_LOG="models/$SYM_LOWER/training_log.json"
else
    LOCAL_MODEL_DIR="models"
    REMOTE_MODEL_DIR="$LXC_MODELS_PATH"
    LOCAL_LOG="models/training_log.json"
fi

# ── 백엔드별 파일 목록 설정 ──────────────────────────────────────────────────
# mlx: ONNX 파일만 전송 (Linux 서버는 onnxruntime으로 추론)
# lgbm: pkl 파일 전송
if [ "$BACKEND" = "mlx" ]; then
  LOCAL_FILES=("$LOCAL_MODEL_DIR/mlx_filter.weights.onnx")
else
  LOCAL_FILES=("$LOCAL_MODEL_DIR/lgbm_filter.pkl")
fi

# ── 파일 존재 확인 ────────────────────────────────────────────────────────────
for f in "${LOCAL_FILES[@]}"; do
  if [[ ! -f "$f" ]]; then
    echo "[오류] 모델 파일 없음: $f"
    exit 1
  fi
done

echo "=== 모델 전송 시작 (백엔드: ${BACKEND}${SYMBOL_ARG:+, 심볼: $SYMBOL_ARG}) ==="
echo "  대상: ${LXC_HOST}:${REMOTE_MODEL_DIR}"

# ── 원격 디렉터리 생성 + 백업 + 상대 백엔드 파일 제거 ───────────────────────
# lgbm 배포 시: 기존 lgbm 백업 후 ONNX 파일 삭제 (ONNX 우선순위 때문에 lgbm이 무시되는 것 방지)
# mlx 배포 시: lgbm 파일 삭제 (명시적으로 mlx만 사용)
ssh "${LXC_HOST}" "
  mkdir -p '${REMOTE_MODEL_DIR}'
  if [ '$BACKEND' = 'lgbm' ]; then
    if [ -f '${REMOTE_MODEL_DIR}/lgbm_filter.pkl' ]; then
      cp '${REMOTE_MODEL_DIR}/lgbm_filter.pkl' '${REMOTE_MODEL_DIR}/lgbm_filter_prev.pkl'
      echo '  기존 lgbm 모델 백업 완료'
    fi
    if [ -f '${REMOTE_MODEL_DIR}/mlx_filter.weights.onnx' ]; then
      rm '${REMOTE_MODEL_DIR}/mlx_filter.weights.onnx'
      echo '  ONNX 파일 제거 완료 (lgbm 우선 적용)'
    fi
  else
    if [ -f '${REMOTE_MODEL_DIR}/lgbm_filter.pkl' ]; then
      rm '${REMOTE_MODEL_DIR}/lgbm_filter.pkl'
      echo '  lgbm 파일 제거 완료 (mlx 우선 적용)'
    fi
  fi
"

# ── 파일 전송 헬퍼 (rsync 우선, scp 폴백) ────────────────────────────────────
_send() {
  local src="$1" dst="$2"
  echo "  전송: $src → ${LXC_HOST}:$dst"
  if command -v rsync &>/dev/null && ssh "${LXC_HOST}" "command -v rsync" &>/dev/null; then
    rsync -avz --progress "$src" "${LXC_HOST}:$dst"
  else
    scp "$src" "${LXC_HOST}:$dst"
  fi
}

# ── 모델 파일 전송 ────────────────────────────────────────────────────────────
for f in "${LOCAL_FILES[@]}"; do
  _send "$f" "${REMOTE_MODEL_DIR}/$(basename "$f")"
done

# ── 학습 로그 전송 ────────────────────────────────────────────────────────────
if [[ -f "$LOCAL_LOG" ]]; then
  _send "$LOCAL_LOG" "${REMOTE_MODEL_DIR}/training_log.json"
  echo "  학습 로그 전송 완료"
fi

echo "=== 전송 완료 ==="
echo ""

# ── 핫리로드 안내 ────────────────────────────────────────────────────────────
# 봇이 캔들마다 모델 파일 mtime을 감지해 자동 리로드한다.
# 컨테이너가 실행 중이면 다음 캔들(최대 1분) 안에 자동 적용된다.
echo "=== 모델 전송 완료 — 봇이 다음 캔들에서 자동 리로드합니다 ==="
if ssh "${LXC_HOST}" "docker inspect -f '{{.State.Running}}' cointrader 2>/dev/null | grep -q true"; then
  echo "  컨테이너 실행 중: 다음 캔들 마감 시 자동 핫리로드 예정"
else
  echo "  cointrader 컨테이너가 실행 중이 아닙니다."
fi
