#!/usr/bin/env bash
# Load EtherGold / fixture-bridge env (FIXTURE_POS, debug/prod mode, CHANNEL, etc.).
# Sourced by run/start/stop/switch scripts — do not execute directly.
#
# Search order (first file found wins for unset keys only):
#   1. /etc/ethergold/ethergold.env (+ role.env)
#   2. /etc/fixture/fixture-bridge.env / fixture-pos.env (legacy)
#   3. ${ETHERGOLD_ROOT}/fixture-bridge.env
#   4. ${FIXTURE_ENV_FILE} if set
#   5. sync/fixture-bridge.env next to this script
#
# FIXTURE_MODE=debug applies baseline-aligned defaults for any key still unset
# (see fixture_bridge.env.example — June 22 good SuperBall session).

_fixture_env_apply_file() {
  local file="$1"
  [[ -f "${file}" ]] || return 0
  if grep -q $'\r' "${file}" 2>/dev/null; then
    sed -i 's/\r$//' "${file}" 2>/dev/null || true
  fi
  # shellcheck source=/dev/null
  source "${file}"
}

_fixture_env_set_default() {
  local key="$1" val="$2"
  if [[ -z "${!key+x}" ]]; then
    export "${key}=${val}"
  fi
}

_fixture_env_apply_debug_defaults() {
  [[ "${FIXTURE_MODE:-}" == "debug" ]] || return 0

  _fixture_env_set_default FIXTURE_PROD 0
  _fixture_env_set_default CHANNEL machine
  # EG 2.2 C spine — bridge requires these; listen launchers force INJECT=0.
  _fixture_env_set_default POG422_UARTD 1
  _fixture_env_set_default POG422_UARTD_CAPTURE 1
  _fixture_env_set_default POG422_UARTD_INJECT 1
  _fixture_env_set_default FIXTURE_LAB_KENO_JPOT_SYNTH 0
  _fixture_env_set_default FIXTURE_LAB_POKER_ROYAL_SYNTH 0
  _fixture_env_set_default FIXTURE_LAB_SPINJACK_FLUSHJACK_SYNTH 0
  _fixture_env_set_default FIXTURE_LAB_TOUCH6_JPOT_SYNTH 0
  _fixture_env_set_default FIXTURE_DEBUG_LOG_ROTATE 1
  _fixture_env_set_default FIXTURE_DEBUG_LOG_MAX_BYTES $((25 * 1024 * 1024))
  _fixture_env_set_default FIXTURE_DEBUG_LOG_ROTATE_UTC_DAILY 1
  _fixture_env_set_default FIXTURE_DEBUG_LOG_MAX_AGE_S $((7 * 86400))
  _fixture_env_set_default SUPPRESS_UART_ECHO 0
  _fixture_env_set_default VERBOSE 1
  _fixture_env_set_default CLEAR_CAPTURE 1
  _fixture_env_set_default FIXTURE_LINK_WATCH 1
  _fixture_env_set_default FIXTURE_LINK_ARP 0
  _fixture_env_set_default FIXTURE_ETH_LIVE_PORTS_ONLY 1
  _fixture_env_set_default FIXTURE_ETH_RELAY_ONLY 0
  _fixture_env_set_default JUN11_ETH_LEGACY 0
  _fixture_env_set_default ETH_PORTS eth0,eth1
  # June 22 baseline status-0x0D synth (v16f SuperBall concurrent)
  _fixture_env_set_default FIXTURE_STATUS_0D_FIRST_ONLY 0
  _fixture_env_set_default FIXTURE_STATUS_0D_BLOCK_ALL 1
  _fixture_env_set_default FIXTURE_STATUS_0D_SYNTH 1
  _fixture_env_set_default FIXTURE_STATUS_0D_FIRST_PASSTHROUGH 1
  _fixture_env_set_default FIXTURE_STATUS_0D_SYNTH_FROM_X9 1
  _fixture_env_set_default FIXTURE_STATUS_0D_SYNTH_LOOSE_COUNTER 0
  _fixture_env_set_default FIXTURE_STATUS_0D_DEDUPE_MS 5000
  # Master-native SCR bench (pos3 LNT baseline before slave relay tests)
  _fixture_env_set_default FIXTURE_SCR_DIAG 0
  _fixture_env_set_default FIXTURE_SCR_MASTER_NATIVE_ONLY 0
  _fixture_env_set_default FIXTURE_HS_WITNESS 1
  _fixture_env_set_default FIXTURE_STOP_GREMLINS 1
}

_fixture_env_apply_prod_lab_guard() {
  [[ "${FIXTURE_PROD:-0}" == "1" ]] || return 0
  # Production: natural gameplay only — lab outcome forcing must never run.
  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
}

_fixture_env_detect_pos() {
  [[ -n "${FIXTURE_POS:-}" ]] && [[ "${FIXTURE_POS}" =~ ^[1-9][0-9]?$ ]] && return 0
  if [[ -f /etc/ethergold/ethergold.env ]]; then
    # shellcheck source=/dev/null
    source /etc/ethergold/ethergold.env
  fi
  if [[ -f /etc/fixture/fixture-pos.env ]]; then
    # shellcheck source=/dev/null
    source /etc/fixture/fixture-pos.env
  fi
  [[ -n "${FIXTURE_POS:-}" ]] && [[ "${FIXTURE_POS}" =~ ^[1-9][0-9]?$ ]] && return 0
  local short
  short="$(hostname -s 2>/dev/null || hostname)"
  short="${short%%.*}"
  if [[ "${short}" =~ ^topbox([1-5])w$ ]]; then
    FIXTURE_POS=$((BASH_REMATCH[1] * 10 + 1))
    return 0
  fi
  if [[ "${short}" =~ ^topbox([1-5])1$ ]]; then
    FIXTURE_POS=$((BASH_REMATCH[1] * 10 + 1))
    return 0
  fi
  case "${short}" in
    topbox1) FIXTURE_POS=1 ;;
    topbox2) FIXTURE_POS=2 ;;
    topbox3) FIXTURE_POS=3 ;;
    topbox4) FIXTURE_POS=4 ;;
    topbox5) FIXTURE_POS=5 ;;
  esac
  if [[ -z "${FIXTURE_POS:-}" && "${short}" =~ ^topbox([1-9][0-9]?)$ ]]; then
    FIXTURE_POS="${BASH_REMATCH[1]}"
  fi
}

_fixture_env_export_all() {
  # Values from fixture-bridge.env are sourced, not exported — child scripts
  # (hat_fixture_bridge.sh) would otherwise see hat defaults (uartd=1, synth=0).
  local k
  for k in \
    FIXTURE_POS PI_LABEL FIXTURE_MODE FIXTURE_PROD PULL_LAYOUT \
    ETHERGOLD_ROLE ETHERGOLD_PROFILE ETHERGOLD_BENCH POG_EDGE_BENCH \
    CHANNEL POG422_UARTD POG422_UARTD_CAPTURE POG422_UARTD_INJECT \
    POG422_HS_PATH POG422_UARTD_SOCK \
    POG422_TIMING_TRACE POG422_TIMING_TRACE_PATH \
    FIXTURE_LAB_KENO_JPOT_SYNTH FIXTURE_LAB_POKER_ROYAL_SYNTH FIXTURE_LAB_SPINJACK_FLUSHJACK_SYNTH FIXTURE_LAB_TOUCH6_JPOT_SYNTH FIXTURE_LAB_SUPERPICK_JPOT_SYNTH FIXTURE_LAB_BINGO_JPOT_SYNTH FIXTURE_LAB_TRIPLE7S_JPOT_SYNTH \
    FIXTURE_LAB_SPINJACK_GAME FIXTURE_LAB_SPINJACK_TID \
    FIXTURE_DEBUG_LOG_ROTATE FIXTURE_DEBUG_LOG_MAX_BYTES FIXTURE_DEBUG_LOG_ROTATE_UTC_DAILY FIXTURE_DEBUG_LOG_MAX_AGE_S \
    SUPPRESS_UART_ECHO VERBOSE CLEAR_CAPTURE \
    FIXTURE_LINK_WATCH FIXTURE_LINK_ARP FIXTURE_ETH_LIVE_PORTS_ONLY FIXTURE_ETH_RELAY_ONLY \
    JUN11_ETH_LEGACY ETH_PORTS \
    FIXTURE_STATUS_0D_FIRST_ONLY FIXTURE_STATUS_0D_BLOCK_ALL FIXTURE_STATUS_0D_SYNTH \
    FIXTURE_STATUS_0D_FIRST_PASSTHROUGH FIXTURE_STATUS_0D_SYNTH_FROM_X9 \
    FIXTURE_STATUS_0D_SYNTH_LOOSE_COUNTER FIXTURE_STATUS_0D_DEDUPE_MS \
    FIXTURE_SCR_DIAG FIXTURE_SCR_MASTER_NATIVE_ONLY FIXTURE_HS_WITNESS FIXTURE_STOP_GREMLINS \
    FIXTURE_EARLY_WIN_PHASE1 FIXTURE_EARLY_WIN_DRY_RUN FIXTURE_EARLY_WIN_DEDUPE_MS \
    FIXTURE_EARLY_WIN_MAX_LOOPS DYZINEFRAME_FLAG_BASE; do
    if [[ -n "${!k+x}" ]]; then
      export "${k}"
    fi
  done
}

if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
  echo "source_ethergold_env.sh — source from run/start scripts, do not execute" >&2
  exit 1
fi

_SYNC_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
if [[ -f "${_SYNC_DIR}/ethergold_paths.sh" ]]; then
  # shellcheck source=ethergold_paths.sh
  source "${_SYNC_DIR}/ethergold_paths.sh"
fi
ETHERGOLD_ROOT="${ETHERGOLD_ROOT:-/home/topbox/EtherGold}"

for _env in \
  /etc/ethergold/ethergold.env \
  /etc/ethergold/role.env \
  /etc/fixture/fixture-bridge.env \
  /etc/fixture/fixture-pos.env \
  "${ETHERGOLD_ROOT}/fixture-bridge.env" \
  "${FIXTURE_ENV_FILE:-}" \
  "${_SYNC_DIR}/fixture-bridge.env"; do
  _fixture_env_apply_file "${_env}"
done

_fixture_env_apply_debug_defaults
_fixture_env_apply_prod_lab_guard
_fixture_env_detect_pos
_fixture_env_export_all

unset _SYNC_DIR _env
