#!/usr/bin/env bash
# Production POG-EDGE bridge — WireGuard+gretap + local game ETH (end-of-bank only).
#
# Requires /etc/ethergold/edge.env (or legacy /etc/fixture/edge.env) with EDGE_MODE=1.
# Uplink (EDGE_UPLINK=eth0|wlanN) carries WG only; game uses eth_game + gretap0.
#
# Usage:
#   sudo bash run_bridge_edge_prod.sh
#   sudo bash enable_edge.sh --uplink wlan0 --role peer-a

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

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BRIDGE_ROOT="${SCRIPT_DIR}"
EDGE_ROOT="${BRIDGE_ROOT}/pog-edge"

if [[ -f "${BRIDGE_ROOT}/../sync/ethergold_paths.sh" ]]; then
  # shellcheck source=../sync/ethergold_paths.sh
  source "${BRIDGE_ROOT}/../sync/ethergold_paths.sh"
else
  # shellcheck source=/dev/null
  source "${HOME}/EtherGold/sync/ethergold_paths.sh"
fi

# shellcheck source=pog-edge/pog_edge_env.sh
source "${EDGE_ROOT}/pog_edge_env.sh"

if [[ "${EDGE_MODE}" != "1" ]]; then
  echo "FATAL: EDGE_MODE=1 required — use run_bridge_prod.sh or enable_edge.sh" >&2
  exit 1
fi

if [[ -z "${POG_EDGE_ROLE}" ]]; then
  echo "FATAL: EDGE_ROLE=peer-a|peer-b (or POG_EDGE_ROLE) required in /etc/ethergold/edge.env" >&2
  exit 1
fi

if [[ "${EDGE_UPLINK}" != "eth0" && "${EDGE_UPLINK}" != wlan* ]]; then
  echo "FATAL: EDGE_UPLINK must be eth0 or wlanN for edge mode (got ${EDGE_UPLINK})" >&2
  exit 1
fi

FIXTURE_POS="${FIXTURE_POS:-1}"
export FIXTURE_POS
export PI_LABEL="${PI_LABEL:-$(hostname)}"
export CHANNEL="${CHANNEL:-both}"
export FIXTURE_PROD=1
export FIXTURE_LAB_KENO_JPOT_SYNTH=0
export FIXTURE_LAB_POKER_ROYAL_SYNTH=0
export FIXTURE_LAB_SPINJACK_FLUSHJACK_SYNTH=0
export FIXTURE_LAB_TOUCH6_JPOT_SYNTH=0
export FIXTURE_LAB_SUPERPICK_JPOT_SYNTH=0
export FIXTURE_LAB_BINGO_JPOT_SYNTH=0
export FIXTURE_LAB_TRIPLE7S_JPOT_SYNTH=0
export FIXTURE_LAB_WITHHOLD_STATUS_0D=0
export LAB_WITHHOLD_STATUS_0D=0
export JUN11_ETH_LEGACY=0
export CLEAR_CAPTURE=0
export VERBOSE=0
export STATS_INTERVAL=0
export FIXTURE_PROD_ERRORS_MAX_BYTES="${FIXTURE_PROD_ERRORS_MAX_BYTES:-10240}"
export FIXTURE_PROD_LOG_MAX_AGE_S="${FIXTURE_PROD_LOG_MAX_AGE_S:-86400}"
export FIXTURE_PROD_SUPERVISOR_LOG_MAX_BYTES="${FIXTURE_PROD_SUPERVISOR_LOG_MAX_BYTES:-10240}"
export WAIT_HS_INACTIVE=1
export FLUSH_RX_BEFORE_TX=0
export SUPPRESS_UART_ECHO=0
export FIXTURE_LINK_WATCH=1
export LINK_WATCH_INTERVAL=2.0
export LINK_RECOVER=0
export FIXTURE_LINK_ARP=0
export FIXTURE_ETH_LIVE_PORTS_ONLY=1
export FIXTURE_ETH_RELAY_ONLY=0
export FIXTURE_STATUS_0D_BLOCK_ALL=1
export FIXTURE_STATUS_0D_SYNTH=1
export FIXTURE_STATUS_0D_FIRST_PASSTHROUGH=1
export FIXTURE_STATUS_0D_SYNTH_FROM_X9=1
export POG422_UARTD="${POG422_UARTD:-1}"
export POG422_UARTD_INJECT="${POG422_UARTD_INJECT:-1}"
export PRE_TX_US=500
export POST_HS_INACTIVE_US=100
export OUTPUT_DIR="${OUTPUT_DIR:-${ETHERGOLD_LOGS}}"
export LOG_DIR="${LOG_DIR:-${ETHERGOLD_LOGS}}"
export POG_EDGE_BENCH=0

mkdir -p "${OUTPUT_DIR}" "${LOG_DIR}"

if [[ "${EUID}" -ne 0 ]]; then
  echo "FATAL: run with sudo (tunnel_up needs root)" >&2
  exit 1
fi

REAL_USER="${SUDO_USER:-topbox}"

bash "${EDGE_ROOT}/tunnel_up.sh"
if [[ -f "${EDGE_ROOT}/.active_gretap" ]]; then
  GRETAP_IF="$(tr -d '\r\n' < "${EDGE_ROOT}/.active_gretap")"
  export GRETAP_IF
fi
bash "${EDGE_ROOT}/prep_eth_game_for_fixture.sh"

# AF_PACKET game plane: hub/spoke = gretap only; never put wlan* in ETH_PORTS.
_topo="${EDGE_TOPOLOGY:-}"
_role="${POG_EDGE_ROLE:-${EDGE_ROLE:-}}"
_game="${POG_EDGE_GAME_IF:-}"
if [[ "${_game}" == wlan* ]]; then
  _game=""
fi
if [[ "${_topo}" == "hub" || "${_role}" == "hub" ]]; then
  _ports=()
  if [[ -f "${EDGE_ROOT}/.active_spoke_gretaps" ]]; then
    while IFS= read -r g; do
      g="$(echo "${g}" | tr -d '\r\n')"
      [[ -n "${g}" ]] && _ports+=("${g}")
    done < "${EDGE_ROOT}/.active_spoke_gretaps"
  fi
  if [[ ${#_ports[@]} -eq 0 && -n "${GRETAP_IF}" ]]; then
    _ports+=("${GRETAP_IF}")
  fi
  IFS=,; export ETH_PORTS="${_ports[*]}"; unset IFS
  export LINK_WATCH_INTERFACE="${POG_EDGE_LAN_IF:-${EDGE_UPLINK:-${GRETAP_IF}}}"
elif [[ "${_topo}" == "spoke" || "${_role}" == "spoke" ]]; then
  export ETH_PORTS="${GRETAP_IF}"
  export LINK_WATCH_INTERFACE="${POG_EDGE_LAN_IF:-${EDGE_UPLINK:-${GRETAP_IF}}}"
elif [[ -n "${_game}" ]]; then
  export ETH_PORTS="${_game},${GRETAP_IF}"
  export LINK_WATCH_INTERFACE="${_game}"
else
  export ETH_PORTS="${GRETAP_IF}"
  export LINK_WATCH_INTERFACE="${GRETAP_IF}"
fi

bash "${BRIDGE_ROOT}/install.sh"
bash "${BRIDGE_ROOT}/ensure_tty_xrusb.sh"

echo "=== prod edge bridge host=${PI_LABEL} role=${POG_EDGE_ROLE} uplink=${EDGE_UPLINK} ==="
echo "  ETH_PORTS=${ETH_PORTS} (uplink ${EDGE_UPLINK} is WG transport only; wlan* not in ETH_PORTS)"
cd "${BRIDGE_ROOT}"
export OUTPUT_DIR LOG_DIR ETH_PORTS LINK_WATCH_INTERFACE
exec sudo -u "${REAL_USER}" env \
  FIXTURE_POS="${FIXTURE_POS}" PI_LABEL="${PI_LABEL}" CHANNEL="${CHANNEL}" \
  FIXTURE_PROD=1 ETH_PORTS="${ETH_PORTS}" FIXTURE_LINK_ARP=0 \
  POG422_UARTD="${POG422_UARTD}" POG422_UARTD_INJECT="${POG422_UARTD_INJECT}" \
  OUTPUT_DIR="${OUTPUT_DIR}" LOG_DIR="${LOG_DIR}" \
  CLEAR_CAPTURE=0 VERBOSE=0 STATS_INTERVAL=0 \
  WAIT_HS_INACTIVE=1 FIXTURE_STATUS_0D_BLOCK_ALL=1 FIXTURE_STATUS_0D_SYNTH=1 \
  FIXTURE_STATUS_0D_FIRST_PASSTHROUGH=1 FIXTURE_STATUS_0D_SYNTH_FROM_X9=1 \
  LINK_WATCH_INTERFACE="${LINK_WATCH_INTERFACE}" \
  bash "${BRIDGE_ROOT}/hat_fixture_bridge.sh"
