#!/usr/bin/env bash
# move_source_wids_directory_after_merge
# 合併後搬移指定 source world_id 的 server 相關目錄到 prepare 目錄
# target world id 不處理

set -uo pipefail

if [ $# -lt 4 ]; then
  echo "用法: $0 <environment:test/live> <dest_directory> <target_world_id> <source_world_id1> [source_world_id2 ...]" >&2
  exit 1
fi

environment="$1"; shift
dest_directory="$1"; shift
target_world_id="$1"; shift  # target 不處理（保留參數但不使用）
source_world_ids=("$@")

SSH_OPT=(
  -o StrictHostKeyChecking=no
  -o BatchMode=yes
  -o ConnectTimeout=10
  -o ServerAliveInterval=10
  -o ServerAliveCountMax=3
)

log_ts() { date '+%Y-%m-%d %H:%M:%S'; }
log_info() { echo "[${0##*/}] $(log_ts) INFO: $*"; }
log_match() { echo "[${0##*/}] $(log_ts) MATCHED_ENTRY: $*"; }
log_moved() { echo "[${0##*/}] $(log_ts) MOVED: $*"; }
log_error() { echo "[${0##*/}] $(log_ts) ERROR: $*" >&2; }

fail_count=0

for world_id in "${source_world_ids[@]}"; do
  if ! [[ "${world_id}" =~ ^[0-9]+$ ]]; then
    log_error "world_id 必須是數字：${world_id}"
    fail_count=$((fail_count + 1))
    continue
  fi

  SET_ID=$((world_id / 100))

  if [ "${environment}" == "live" ]; then
    MACHINE="WS${world_id}"
  elif [ "${environment}" == "test" ]; then
    if [ "${SET_ID}" -ge 10 ] && [ "${SET_ID}" -lt 20 ]; then
      MACHINE="MERGE_ASIA"
    elif [ "${SET_ID}" -ge 20 ] && [ "${SET_ID}" -lt 30 ]; then
      MACHINE="MERGE_US"
    elif [ "${SET_ID}" -ge 30 ] && [ "${SET_ID}" -lt 40 ]; then
      MACHINE="MERGE_EU"
    else
      log_error "Unknown SET_ID ${SET_ID} (world_id=${world_id})"
      fail_count=$((fail_count + 1))
      continue
    fi
  else
    log_error "Unknown environment ${environment}, must be test or live"
    exit 1
  fi

  src_path="\$HOME/servers${SET_ID}"
  dest_path="\$HOME/prepare/${dest_directory}/servers${SET_ID}"

  log_info "START world_id=${world_id} SET_ID=${SET_ID} MACHINE=${MACHINE} SRC=${src_path} DEST=${dest_path}"

  if ! ssh "${SSH_OPT[@]}" "${MACHINE}" "mkdir -p \"${dest_path}\""; then
    log_error "mkdir failed on ${MACHINE} (world_id=${world_id}, SET_ID=${SET_ID})"
    fail_count=$((fail_count + 1))
    continue
  fi

  # 產生「要搬的目錄清單」
  # 規則：
  # - 只看 directory（find -type d）
  # - world_id 左側必須是字串開頭或非數字：避免 1121 誤中 11121/11211
  # - world_id 右側允許數字：可命中 ...11061 / ...11111
  remote_dirs=$(
    ssh "${SSH_OPT[@]}" "${MACHINE}" \
      "bash -lc 'cd \"${src_path}\" 2>/dev/null || exit 0
                find . -maxdepth 1 -mindepth 1 -type d -printf \"%f\n\" \
                  | grep -E \"(^|[^0-9])${world_id}\" || true
                exit 0'"
  ) || {
    log_error "list dirs failed on ${MACHINE} (world_id=${world_id}, SET_ID=${SET_ID})"
    fail_count=$((fail_count + 1))
    continue
  }

  if [ -z "${remote_dirs}" ]; then
    log_info "NO_MATCH world_id=${world_id} on ${MACHINE} at ${src_path}"
    continue
  fi

  moved_this_wid=0
  matched_this_wid=0

  while IFS= read -r dir; do
    [ -n "${dir}" ] || continue
    matched_this_wid=$((matched_this_wid + 1))
    log_match "machine=${MACHINE} world_id=${world_id} set_id=${SET_ID} dir=${dir}"

    if ssh "${SSH_OPT[@]}" "${MACHINE}" \
      "cd \"${src_path}\" && mv \"${dir}\" \"${dest_path}/.\""; then
      moved_this_wid=$((moved_this_wid + 1))
      log_moved "machine=${MACHINE} world_id=${world_id} set_id=${SET_ID} dir=${dir} -> ${dest_path}/"
    else
      log_error "mv failed on ${MACHINE} (world_id=${world_id}, set_id=${SET_ID}, dir=${dir})"
      fail_count=$((fail_count + 1))
      continue
    fi
  done <<< "${remote_dirs}"

  log_info "END world_id=${world_id} matched=${matched_this_wid} moved=${moved_this_wid} MACHINE=${MACHINE}"
done

if [ "${fail_count}" -gt 0 ]; then
  log_error "DONE with errors: fail_count=${fail_count}"
  exit 2
fi

log_info "DONE OK"
exit 0

