#!/usr/bin/env bash
# Unjail a jailed MYTC validator — checks sync, balance, then submits unjail TX.
# Usage: curl -sSL .../unjail-validator.sh | sudo bash

set -euo pipefail

readonly BIN_PATH="/usr/local/bin/mytcd"
readonly CHAIN_ID="mytherra-1"
readonly KEYRING="test"
readonly MYTC_HOME="/home/mytc/.mytc"
readonly SERVICE_NAME="mytc"

RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m'
log()  { echo -e "${CYAN}▸${NC} $*"; }
ok()   { echo -e "${GREEN}✓${NC} $*"; }
warn() { echo -e "${YELLOW}⚠${NC}  $*" >&2; }
die()  { echo -e "${RED}✗ $*${NC}" >&2; exit 1; }

# ── Check node is running ───────────────────────────────────────────────────
log "Checking if node is running…"
if ! systemctl is-active --quiet "$SERVICE_NAME"; then
  die "Node service ($SERVICE_NAME) is not running. Start it first:\n  sudo systemctl start $SERVICE_NAME"
fi
ok "Node service is active."

# ── Check sync ──────────────────────────────────────────────────────────────
log "Checking sync status…"
local status_json catching height
status_json=$(sudo -u mytc "$BIN_PATH" status --home "$MYTC_HOME" 2>/dev/null || true)
if [[ -z "$status_json" ]]; then
  die "Cannot query node status. Is mytcd running?"
fi
catching=$(echo "$status_json" | jq -r '(.SyncInfo // .sync_info).catching_up')
height=$(echo "$status_json" | jq -r '(.SyncInfo // .sync_info).latest_block_height')
if [[ "$catching" == "true" ]]; then
  die "Node is still catching up at block $height. Wait until 'catching_up: false', then retry.\n  Tip: journalctl -u $SERVICE_NAME -f"
fi
ok "Node is synced at block $height."

# ── Get validator operator address ──────────────────────────────────────────
log "Fetching validator info…"
local valoper addr
valoper=$(sudo -u mytc "$BIN_PATH" keys show validator --bech val -a --keyring-backend "$KEYRING" --home "$MYTC_HOME" 2>/dev/null) \
  || die "No 'validator' key found. Did you run 'become-validator.sh init' first?"
addr=$(sudo -u mytc "$BIN_PATH" keys show validator -a --keyring-backend "$KEYRING" --home "$MYTC_HOME" 2>/dev/null)
ok "Validator operator: $valoper"

# ── Check if actually jailed ────────────────────────────────────────────────
log "Checking validator status…"
local validator_json jailed tokens
validator_json=$(sudo -u mytc "$BIN_PATH" query staking validator "$valoper" --home "$MYTC_HOME" --output json 2>/dev/null) \
  || die "Cannot query validator. Is the node fully synced?"
jailed=$(echo "$validator_json" | jq -r '.jailed')
tokens=$(echo "$validator_json" | jq -r '.tokens')
local tokens_mytc=$((tokens / 1000000))

if [[ "$jailed" != "true" ]]; then
  ok "Validator is NOT jailed. Everything looks good (stake: ${tokens_mytc} MYTC)."
  exit 0
fi
warn "Validator is JAILED (stake: ${tokens_mytc} MYTC). Attempting unjail…"

# ── Check balance for fee ───────────────────────────────────────────────────
log "Checking balance for unjail fee…"
local bal
bal=$(sudo -u mytc "$BIN_PATH" query bank balances "$addr" --home "$MYTC_HOME" --output json 2>/dev/null \
  | jq -r '[.balances[] | select(.denom=="umytc") | .amount][0] // "0"')
if (( bal < 10000 )); then
  die "Balance too low for unjail fee. Have: $((bal / 1000000)) MYTC, need: ~0.01 MYTC.\n  Send some MYTC to $addr and retry."
fi
ok "Balance OK ($((bal / 1000000)) MYTC)."

# ── Submit unjail TX ────────────────────────────────────────────────────────
log "Submitting unjail transaction…"
local txout txhash code
set +e
txout=$(sudo -u mytc "$BIN_PATH" tx slashing unjail \
  --from validator \
  --keyring-backend "$KEYRING" \
  --chain-id "$CHAIN_ID" \
  --gas auto --gas-adjustment 1.4 --fees 5000umytc \
  --home "$MYTC_HOME" \
  -y --output json 2>&1)
set -e
code=$(echo "$txout" | jq -r '.code // empty')
txhash=$(echo "$txout" | jq -r '.txhash // empty')

if [[ "$code" != "0" && -n "$code" ]]; then
  die "Unjail TX rejected (code=$code):\n$(echo "$txout" | jq -r '.raw_log // .' | head -3)"
fi

ok "Unjail TX submitted: $txhash"
log "Waiting 8s for inclusion…"
sleep 8

# ── Verify ──────────────────────────────────────────────────────────────────
local validator_after jailed_after
validator_after=$(sudo -u mytc "$BIN_PATH" query staking validator "$valoper" --home "$MYTC_HOME" --output json 2>/dev/null)
jailed_after=$(echo "$validator_after" | jq -r '.jailed')

if [[ "$jailed_after" == "false" ]]; then
  cat <<EOF

${GREEN}════════════════════════════════════════════════════════════════════${NC}
  ${GREEN}✓ Validator successfully unjailed!${NC}

  Your validator is now active again.
  Watch your signing to avoid future jailing:
    ${CYAN}sudo -u mytc mytcd query slashing signing-info \\
      \$(sudo -u mytc mytcd tendermint show-address --home $MYTC_HOME) --home $MYTC_HOME${NC}
${GREEN}════════════════════════════════════════════════════════════════════${NC}

EOF
else
  warn "TX submitted but validator still shows jailed. May need one more block."
  warn "Check again in ~10s with: sudo -u mytc mytcd query staking validator $valoper --home $MYTC_HOME"
fi
