#!/usr/bin/env bash
# Production bridge launcher — v16ab core, errors-only logging, no bench capture.
# Same jun11-good code path as debug; FIXTURE_PROD=1 enables --prod (minimal logging).
#
# Usage (bench: FIXTURE_POS from fixture-bridge.env; field: defaults to 1):
#   bash run_bridge_prod.sh

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}"
if [[ -f "${BRIDGE_ROOT}/../sync/ethergold_paths.sh" ]]; then
  # shellcheck source=../sync/ethergold_paths.sh
  source "${BRIDGE_ROOT}/../sync/ethergold_paths.sh"
elif [[ -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
# Flat layout: runtime files live beside this launcher (was jun11-good/ subfolder).
GOOD="${BRIDGE_ROOT}"
DAEMON="${ETHERGOLD_DAEMON:-${BRIDGE_ROOT}}"
cd "${BRIDGE_ROOT}"

_CLI_POS="${FIXTURE_POS-}"
if [[ -f "${ETHERGOLD_SYNC:-${HOME}/EtherGold/sync}/source_ethergold_env.sh" ]]; then
  # shellcheck source=/dev/null
  source "${ETHERGOLD_SYNC:-${HOME}/EtherGold/sync}/source_ethergold_env.sh"
elif [[ -f "${HOME}/EtherGold/sync/source_fixture_env.sh" ]]; then
  # shellcheck source=/dev/null
  source "${HOME}/EtherGold/sync/source_fixture_env.sh"
fi
if [[ -n "${_CLI_POS}" ]]; then
  FIXTURE_POS="${_CLI_POS}"
fi
unset _CLI_POS

if [[ -f /etc/ethergold/edge.env ]]; then
  # shellcheck disable=SC1091
  source /etc/ethergold/edge.env
elif [[ -f /etc/fixture/edge.env ]]; then
  # shellcheck disable=SC1091
  source /etc/fixture/edge.env
fi

# EDGE seats must not run copper ETH_PORTS — hand off to unified entry.
if [[ "${EDGE_MODE:-0}" == "1" && -z "${ETHERGOLD_ENTRY:-}" ]]; then
  echo "EDGE_MODE=1: redirecting run_bridge_prod.sh → run_ethergold.sh" >&2
  export FIXTURE_PROD="${FIXTURE_PROD:-1}"
  exec bash "${SCRIPT_DIR}/run_ethergold.sh" "$@"
fi

# Middle-of-chain: both SEEED ports are game. Persistent unmanage is
# install_nm_eth_unmanaged.sh (conf.d); nmcli here is best-effort only (topbox
# often lacks network-control — do not rely on it).
if [[ "${EDGE_MODE:-0}" != "1" ]] && command -v nmcli >/dev/null 2>&1; then
  nmcli dev set eth0 managed no 2>/dev/null || true
  nmcli dev set eth1 managed no 2>/dev/null || true
fi

# Production is POSITION-FREE. Field identity comes from the OS hostname
# (topbox_<asset#>), not a bench FIXTURE_POS. FIXTURE_POS survives only as an
# internal timing/bookkeeping id (default 1) so the shared bridge args stay valid;
# it is never required in the field and carries no "position" meaning.
# Bench: prefer ~/EtherGold/fixture-bridge.env when present (loaded above).
FIXTURE_POS="${FIXTURE_POS:-1}"
if ! [[ "${FIXTURE_POS}" =~ ^[1-9][0-9]?$ ]]; then
  echo "WARN: FIXTURE_POS invalid; using 1 for log/socket routing only (not a run gate)" >&2
  FIXTURE_POS=1
fi

# Hard-coded production config (matches v16ab jun11-good milestone stack).
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 LAB_GAMEPLAY_SYNTH=0
export LAB_GAMEPLAY_SYNTH_ALLOW_PROD=0
export JUN11_ETH_LEGACY=0
export ETH_PORTS="eth0,eth1"
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_WATCH_INTERFACE="eth1"
export LINK_RECOVER=0
export LINK_RECOVER_AFTER=0
export LINK_RECOVER_COOLDOWN=15
export LINK_RECOVER_HARD_AFTER=0
export LINK_RECOVER_ETH_BOUNCE=0
export JUN11_ETH=directional
export FIXTURE_LINK_ARP=0
export FIXTURE_ETH_LIVE_PORTS_ONLY=1
export FIXTURE_ETH_RELAY_ONLY=0
export FIXTURE_STATUS_0D_FIRST_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 FIXTURE_STATUS_0D_SYNTH_LOOSE_COUNTER=0
export FIXTURE_STATUS_0D_DEDUPE_MS=5000
export POG422_UARTD="${POG422_UARTD:-1}"
export POG422_UARTD_INJECT="${POG422_UARTD_INJECT:-1}"
export ETHERGOLD_ROOT="${ETHERGOLD_ROOT:-/home/topbox/EtherGold}"
export ETHERGOLD_PROGRESSIVES_CSV="${ETHERGOLD_PROGRESSIVES_CSV:-${ETHERGOLD_ROOT}/progressives.csv}"
export ETHERGOLD_REAL_USER="${ETHERGOLD_REAL_USER:-topbox}"

if [[ "${POG422_UARTD}" != "1" || "${POG422_UARTD_INJECT}" != "1" ]]; then
  echo "FATAL: EG 2.2 requires POG422_UARTD=1 and POG422_UARTD_INJECT=1" >&2
  exit 1
fi

if [[ "${CHANNEL}" == "ois" ]]; then
  export FIXTURE_STATUS_0D_BLOCK_ALL=0
  export FIXTURE_STATUS_0D_SYNTH=0
  export FIXTURE_STATUS_0D_FIRST_PASSTHROUGH=0
  export FIXTURE_STATUS_0D_SYNTH_FROM_X9=0
fi

if [[ "${FIXTURE_POS}" == "4" ]]; then
  export PRE_TX_US=300
  export POST_HS_INACTIVE_US=150
else
  export PRE_TX_US=500
  export POST_HS_INACTIVE_US=100
fi

export OUTPUT_DIR="${OUTPUT_DIR:-${ETHERGOLD_LOGS}}"
export LOG_DIR="${LOG_DIR:-${ETHERGOLD_LOGS}}"
mkdir -p "${OUTPUT_DIR}" "${LOG_DIR}"
touch "${ETHERGOLD_PROGRESSIVES_CSV}" 2>/dev/null || true
if [[ -f "${ETHERGOLD_PROGRESSIVES_CSV}" && ! -w "${ETHERGOLD_PROGRESSIVES_CSV}" ]]; then
  echo "WARN: ${ETHERGOLD_PROGRESSIVES_CSV} not writable — DyzineFrame cannot read root-only file" >&2
  echo "  Fix: sudo chown topbox:topbox ${ETHERGOLD_PROGRESSIVES_CSV} && sudo chmod 644 ${ETHERGOLD_PROGRESSIVES_CSV}" >&2
fi

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

echo "=== prep eth0/eth1 (sudo) ==="
PREP_ETH="${BRIDGE_ROOT}/prep_eth_for_fixture.sh"
[[ -f "${PREP_ETH}" ]] || PREP_ETH="${DAEMON}/prep_eth_for_fixture.sh"
sudo bash "${PREP_ETH}"

echo "=== disable EEE (sudo) ==="
sudo EEE_LOG_FILE="${LOG_DIR}/disable_eth_eee.log" FIXTURE_POS="${FIXTURE_POS}" \
  bash "${GOOD}/disable_eth_eee.sh" >> "${LOG_DIR}/disable_eth_eee.log" 2>&1 || true

echo "=== prod bridge EG 2.2 pos=${FIXTURE_POS} ==="
echo "  POG422_UARTD=${POG422_UARTD}  POG422_UARTD_INJECT=${POG422_UARTD_INJECT}  (C spine)"
cd "${GOOD}"
export OUTPUT_DIR LOG_DIR
HAT="${GOOD}/hat_bridge.sh"
if [[ ! -f "${HAT}" ]]; then
  HAT="${GOOD}/hat_fixture_bridge.sh"
fi
exec bash "${HAT}"
