#!/usr/bin/env bash
# Create or refresh ~/EtherGold/fixture-bridge.env from the sync example.
#
# Usage:
#   cd ~/EtherGold/sync
#   bash install_fixture_bridge_env.sh           # create if missing
#   bash install_fixture_bridge_env.sh --force   # overwrite from example (keeps hostname POS)
#   bash install_fixture_bridge_env.sh --ensure  # upsert EG-required keys; migrate leftover $4 fireworks threshold; keep CHANNEL/POS

if grep -q $'\r' "${BASH_SOURCE[0]}" 2>/dev/null; then
  sed -i 's/\r$//' "${BASH_SOURCE[0]}"
  exec bash "${BASH_SOURCE[0]}" "$@"
fi

set -euo pipefail

SYNC="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=ethergold_paths.sh
source "${SYNC}/ethergold_paths.sh"

EXAMPLE="${SYNC}/fixture_bridge.env.example"
DEST="${ETHERGOLD_ROOT}/fixture-bridge.env"
MODE="create"
[[ "${1:-}" == "--force" ]] && MODE="force"
[[ "${1:-}" == "--ensure" ]] && MODE="ensure"

if [[ ! -f "${EXAMPLE}" ]]; then
  echo "FATAL: missing ${EXAMPLE} — run pull_fixture_shared_from_dropbox.sh first" >&2
  exit 1
fi

_hostname_pos() {
  local short
  short="$(hostname -s 2>/dev/null || hostname)"
  short="${short%%.*}"
  # Local copper witness topboxNw / topboxN1 → POS N1
  if [[ "${short}" =~ ^topbox([1-5])w$ ]]; then
    echo $((BASH_REMATCH[1] * 10 + 1))
    return 0
  fi
  if [[ "${short}" =~ ^topbox([1-5])1$ ]]; then
    echo $((BASH_REMATCH[1] * 10 + 1))
    return 0
  fi
  case "${short}" in
    topbox1) echo 1 ;;
    topbox2) echo 2 ;;
    topbox3) echo 3 ;;
    topbox4) echo 4 ;;
    topbox5) echo 5 ;;
    *)
      if [[ "${short}" =~ ^topbox([1-9][0-9]?)$ ]]; then
        echo "${BASH_REMATCH[1]}"
      else
        echo ""
      fi
      ;;
  esac
}

_hostname_label() {
  local short pos seat
  short="$(hostname -s 2>/dev/null || hostname)"
  short="${short%%.*}"
  if [[ "${short}" =~ ^topbox([1-5])w$ ]]; then
    echo "topbox${BASH_REMATCH[1]}w"
    return 0
  fi
  if [[ "${short}" =~ ^topbox([1-5])1$ ]]; then
    echo "topbox${BASH_REMATCH[1]}w"
    return 0
  fi
  pos="$(_hostname_pos)"
  if [[ -n "${pos}" ]] && [[ "${pos}" =~ ^[1-5]$ ]]; then
    echo "topbox${pos}"
    return 0
  fi
  echo ""
}

_upsert_key() {
  local key="$1" val="$2" file="$3"
  if grep -qE "^${key}=" "${file}" 2>/dev/null; then
    sed -i "s|^${key}=.*|${key}=${val}|" "${file}"
  else
    printf '%s=%s\n' "${key}" "${val}" >> "${file}"
  fi
}

# EG 4.1.0.19+ product default is $50. Leave intentional overrides alone; only
# rewrite the old bench leftover ($4.00 / 400 cents) that enable scripts used to stamp.
_migrate_legacy_fireworks_threshold() {
  local file="$1"
  local cur raw
  [[ -f "${file}" ]] || return 0

  raw="$(grep -E '^FIXTURE_FIREWORKS_WIN_THRESHOLD_USD=' "${file}" 2>/dev/null | head -1 || true)"
  if [[ -n "${raw}" ]]; then
    cur="${raw#FIXTURE_FIREWORKS_WIN_THRESHOLD_USD=}"
    cur="${cur%%#*}"
    cur="$(printf '%s' "${cur}" | tr -d ' \t\r')"
    case "${cur}" in
      4|4.0|4.00|4.000)
        _upsert_key FIXTURE_FIREWORKS_WIN_THRESHOLD_USD 50.00 "${file}"
        echo "NOTE: migrated FIXTURE_FIREWORKS_WIN_THRESHOLD_USD ${cur} → 50.00 (legacy bench default)"
        ;;
    esac
  fi

  raw="$(grep -E '^FIXTURE_EARLY_WIN_SLOT_THRESHOLD_CENTS=' "${file}" 2>/dev/null | head -1 || true)"
  if [[ -n "${raw}" ]]; then
    cur="${raw#FIXTURE_EARLY_WIN_SLOT_THRESHOLD_CENTS=}"
    cur="${cur%%#*}"
    cur="$(printf '%s' "${cur}" | tr -d ' \t\r')"
    if [[ "${cur}" == "400" ]]; then
      _upsert_key FIXTURE_EARLY_WIN_SLOT_THRESHOLD_CENTS 5000 "${file}"
      echo "NOTE: migrated FIXTURE_EARLY_WIN_SLOT_THRESHOLD_CENTS 400 → 5000 (legacy bench default)"
    fi
  fi

  raw="$(grep -E '^FIXTURE_EARLY_WIN_KENO_THRESHOLD_CENTS=' "${file}" 2>/dev/null | head -1 || true)"
  if [[ -n "${raw}" ]]; then
    cur="${raw#FIXTURE_EARLY_WIN_KENO_THRESHOLD_CENTS=}"
    cur="${cur%%#*}"
    cur="$(printf '%s' "${cur}" | tr -d ' \t\r')"
    if [[ "${cur}" == "400" ]]; then
      _upsert_key FIXTURE_EARLY_WIN_KENO_THRESHOLD_CENTS 5000 "${file}"
      echo "NOTE: migrated FIXTURE_EARLY_WIN_KENO_THRESHOLD_CENTS 400 → 5000 (legacy bench default)"
    fi
  fi
}

_ensure_keys() {
  local pos label
  pos="$(_hostname_pos)"
  label="$(_hostname_label)"
  if [[ ! -f "${DEST}" ]]; then
    cp "${EXAMPLE}" "${DEST}"
    chmod 644 "${DEST}"
    if [[ -n "${pos}" ]]; then
      _upsert_key FIXTURE_POS "${pos}" "${DEST}"
      _upsert_key PI_LABEL "${label:-topbox${pos}}" "${DEST}"
    fi
    echo "Created ${DEST}"
  else
    echo "Ensuring EG-required keys in ${DEST}"
  fi
  if grep -q $'\r' "${DEST}" 2>/dev/null; then
    sed -i 's/\r$//' "${DEST}" 2>/dev/null || true
  fi
  _migrate_legacy_fireworks_threshold "${DEST}"
  # Bridge default is C spine on. Do not smash a Pi-HS listen box onto UARTD/inject.
  # Listen launchers also force INJECT=0; hat_listen forces UARTD=0 when HS_PATH=pi.
  local hs_pi=0
  if grep -qE '^POG422_HS_PATH=pi([ #]|$)' "${DEST}" 2>/dev/null \
    || grep -qE '^POG422_UARTD=0([ #]|$)' "${DEST}" 2>/dev/null; then
    hs_pi=1
  fi
  if [[ "${hs_pi}" == "1" ]]; then
    _upsert_key POG422_UARTD 0 "${DEST}"
    _upsert_key POG422_UARTD_CAPTURE 0 "${DEST}"
    _upsert_key POG422_UARTD_INJECT 0 "${DEST}"
    echo "NOTE: Pi-HS / UARTD=0 listen box — --ensure left inject off"
  else
    _upsert_key POG422_UARTD 1 "${DEST}"
    _upsert_key POG422_UARTD_CAPTURE 1 "${DEST}"
    if grep -qE '^POG422_UARTD_INJECT=0([ #]|$)' "${DEST}" 2>/dev/null; then
      _upsert_key POG422_UARTD_INJECT 0 "${DEST}"
    else
      _upsert_key POG422_UARTD_INJECT 1 "${DEST}"
    fi
  fi
  _upsert_key FIXTURE_MODE debug "${DEST}"
  if ! grep -qE '^CHANNEL=' "${DEST}"; then
    if [[ -n "${pos}" ]] && ((pos > 5)); then
      _upsert_key CHANNEL machine "${DEST}"
    else
      _upsert_key CHANNEL both "${DEST}"
    fi
  fi
  if ! grep -qE '^FIXTURE_POS=' "${DEST}" && [[ -n "${pos}" ]]; then
    _upsert_key FIXTURE_POS "${pos}" "${DEST}"
    _upsert_key PI_LABEL "${label:-topbox${pos}}" "${DEST}"
  fi
  grep -E '^(FIXTURE_POS|PI_LABEL|CHANNEL|POG422_UARTD|POG422_UARTD_CAPTURE|POG422_UARTD_INJECT|FIXTURE_MODE|FIXTURE_FIREWORKS_WIN_THRESHOLD_USD)=' "${DEST}" || true
}

if [[ "${MODE}" == "ensure" ]]; then
  _ensure_keys
  exit 0
fi

if [[ -f "${DEST}" && "${MODE}" != "force" ]]; then
  echo "OK: ${DEST} already exists (use --ensure to upsert UARTD keys, or --force to replace)"
  grep -E '^(FIXTURE_POS|CHANNEL|POG422_UARTD|POG422_UARTD_INJECT|FIXTURE_MODE)=' "${DEST}" || true
  exit 0
fi

cp "${EXAMPLE}" "${DEST}"
chmod 644 "${DEST}"

POS="$(_hostname_pos)"
LABEL="$(_hostname_label)"
if [[ -n "${POS}" ]]; then
  _upsert_key FIXTURE_POS "${POS}" "${DEST}"
  _upsert_key PI_LABEL "${LABEL:-topbox${POS}}" "${DEST}"
fi

_upsert_key PULL_LAYOUT legacy "${DEST}"
_upsert_key POG422_UARTD 1 "${DEST}"
_upsert_key POG422_UARTD_CAPTURE 1 "${DEST}"
_upsert_key POG422_UARTD_INJECT 1 "${DEST}"

echo "Created ${DEST}"
grep -E '^(FIXTURE_POS|PI_LABEL|CHANNEL|POG422_UARTD|POG422_UARTD_INJECT|FIXTURE_MODE|PULL_LAYOUT)=' "${DEST}" || true
