#!/bin/bash
# loopctl — эксплуатация Loop: переезды баз и инстансов, прокси, DNS, проверки. Подробно: README.md
set -euo pipefail
D=$(cd "$(dirname "$(readlink -f "$0")")" && pwd)

usage() { cat <<'EOF'
loopctl db move    <куб> <id> <кластер БД> [--scale-0]  перенос базы: dump -> verify -> cutover -> bind
loopctl db migrate <куб> <id> <кластер БД> [--scale-0]  только копия базы (инстанс работает на старой)
loopctl db verify  <куб> <id> [кластер БД]              сверка количества строк
loopctl db cutover <куб> <id> [кластер БД]              переключить инстанс на новую базу
loopctl db bind    <куб> <id>                           прописать базу из CR в визор (провайдер + env)
loopctl k8s move   <id>...                              перенос инстанса на DST (по умолчанию loop-3)
loopctl k8s rebind <id>                                 только секреты + перепривязка в визоре
loopctl proxy make <id> <исходный куб>                  манифест временного прокси -> DST
loopctl proxy traffic <исходный куб> [секунд]           запросы через прокси за интервал (0 = можно снимать)
loopctl dns show|ttl|cname <поддомен> [значение]        записи *.loop.ru в Selectel DNS
loopctl check <id>... | --db <хост> | --all             здоровье инстансов на DST
Кластеры БД: lm, lp3, ff, wilix. Всё, что меняет состояние, спрашивает подтверждение (LOOPCTL_YES=1 — не спрашивать).
EOF
}

db_move() {
  local ctx=$1 id=$2 cl=$3 prev=$D/db/logs/$2.scale0-prev; shift 3
  rm -f "$prev"
  # --scale-0: инстанс остаётся 0 через verify до cutover, иначе посты за это время останутся в старой базе
  if ! MIGRATE_FORCE=1 MIGRATE_KEEP_SCALED=1 "$D/db/migrate-one.sh" "$ctx" "$id" "$cl" "$@" || ! "$D/db/verify-one.sh" "$ctx" "$id" "$cl"; then
    # копия или сверка не прошли: инстанс остаётся на старой базе, вернуть ему реплики после --scale-0
    [ -s "$prev" ] && [ "$(cat "$prev")" -ge 1 ] && kubectl --context "$ctx" -n loop patch mattermost "$id" --type merge -p "{\"spec\":{\"replicas\":$(cat "$prev")}}"
    echo "СТОП: $id остался на старой базе"; return 1
  fi
  [ -s "$prev" ] && [ "$(cat "$prev")" -ge 1 ] && export CUTOVER_REPLICAS=$(cat "$prev")
  "$D/db/cutover-one.sh" "$ctx" "$id" "$cl"
  "$D/db/bind.sh" "$ctx" "$id"
}

[ $# -gt 0 ] && [ "$1" != -h ] && [ "$1" != help ] || { usage; exit 0; }
. "$D/lib/common.sh"   # KUBECONFIG и прочие настройки для всех подкоманд

case "${1:-}/${2:-}" in
  db/move)    shift 2; confirm "Перенесу базу $2 на $3 (dump, verify, cutover, визор)." && LOOPCTL_YES=1 db_move "$@" ;;
  db/migrate) shift 2; confirm "Скопирую базу $2 на ${3:-?} (создам роль и базу, Job pg_dump|psql)." && exec "$D/db/migrate-one.sh" "$@" ;;
  db/verify)  shift 2; exec "$D/db/verify-one.sh" "$@" ;;
  db/cutover) shift 2; confirm "Переключу $2 на новую базу (секрет, env CR, рестарт)." && exec "$D/db/cutover-one.sh" "$@" ;;
  db/bind)    shift 2; exec "$D/db/bind.sh" "$@" ;;
  k8s/move)   shift 2; exec "$D/k8s/move.sh" "$@" ;;
  k8s/rebind) shift 2; exec "$D/k8s/rebind.sh" "$@" ;;
  proxy/make) shift 2; exec "$D/k8s/proxy.sh" "$@" ;;
  proxy/traffic) shift 2; exec "$D/k8s/proxy-traffic.sh" "$@" ;;
  dns/*)      shift 1; exec "$D/dns/dns.sh" "$@" ;;
  check/*)    shift 1; exec "$D/check.sh" "$@" ;;
  *) usage; exit 1 ;;
esac
