#!/usr/bin/env bash
# Source pog-edge env — flat dev/pog-edge layout + field /etc/ethergold/edge.env.
#
# Underlays (do not break eth↔eth):
#   EDGE_MODE=0              copper daisy / directional ETH_PORTS=eth0,eth1
#   EDGE_MODE=1 + peer-a|b   eth↔wlan single-hop EDGE (legacy)
#   EDGE_MODE=1 + hub|spoke  wlan star (this extension)
set -euo pipefail

POG_EDGE_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Flat layout: jun11-good bridge launchers live in parent dev/.
TIMING_ROOT="$(cd "${POG_EDGE_ROOT}/.." && pwd)"

# Canonical: /etc/ethergold/edge.env (legacy /etc/fixture/edge.env is a symlink
# on provisioned seats; plain-file fallback only for unmigrated boxes).
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

# Snapshot canonical topology/role from edge.env before bench.env can override.
_EDGE_TOPOLOGY_CANON="${EDGE_TOPOLOGY:-}"
_EDGE_ROLE_CANON="${EDGE_ROLE:-}"
_EDGE_SPOKE_ID_CANON="${EDGE_SPOKE_ID:-}"

if [[ -f "${POG_EDGE_ROOT}/bench.env" ]]; then
  # shellcheck disable=SC1091
  source "${POG_EDGE_ROOT}/bench.env"
fi

# Wlan-star edge.env wins over leftover single-hop bench.env (POG_EDGE_ROLE=pos4).
if [[ "${_EDGE_TOPOLOGY_CANON}" == "hub" || "${_EDGE_TOPOLOGY_CANON}" == "spoke" ]]; then
  EDGE_TOPOLOGY="${_EDGE_TOPOLOGY_CANON}"
  EDGE_ROLE="${_EDGE_ROLE_CANON:-${_EDGE_TOPOLOGY_CANON}}"
  [[ -n "${_EDGE_SPOKE_ID_CANON}" ]] && EDGE_SPOKE_ID="${_EDGE_SPOKE_ID_CANON}"
  unset POG_EDGE_ROLE
fi
unset _EDGE_TOPOLOGY_CANON _EDGE_ROLE_CANON _EDGE_SPOKE_ID_CANON

EDGE_MODE="${EDGE_MODE:-0}"
EDGE_UPLINK="${EDGE_UPLINK:-eth0}"
EDGE_ROLE="${EDGE_ROLE:-}"
EDGE_TOPOLOGY="${EDGE_TOPOLOGY:-}"
EDGE_BANK="${EDGE_BANK:-0}"
EDGE_SPOKE_ID="${EDGE_SPOKE_ID:-}"
# Default eth1 only when unset. Empty or "none" = tunnel-only (no local game eth).
# Do not use ${EDGE_GAME_IF:-eth1} — that turns enable_edge --game-if none into eth1.
if [[ ! -v EDGE_GAME_IF ]]; then
  EDGE_GAME_IF=eth1
elif [[ "${EDGE_GAME_IF}" == "none" ]]; then
  EDGE_GAME_IF=""
fi
EDGE_DHCP_ONCE="${EDGE_DHCP_ONCE:-1}"
EDGE_WIFI_SSID="${EDGE_WIFI_SSID:-POGCOM}"
EDGE_WIFI_PSK="${EDGE_WIFI_PSK:-}"
EDGE_WIFI_CONN_NAME="${EDGE_WIFI_CONN_NAME:-POGCOM}"
EDGE_BANK_WLAN="${EDGE_BANK_WLAN:-0}"
EDGE_TID_UNICAST="${EDGE_TID_UNICAST:-1}"

POG_EDGE_ROLE="${POG_EDGE_ROLE:-${EDGE_ROLE:-}}"
POG_EDGE_LAN_IF="${POG_EDGE_LAN_IF:-${EDGE_UPLINK}}"
# Preserve empty GAME_IF (tunnel-only); only inherit default when POG_EDGE_GAME_IF unset.
if [[ ! -v POG_EDGE_GAME_IF ]]; then
  POG_EDGE_GAME_IF="${EDGE_GAME_IF}"
elif [[ "${POG_EDGE_GAME_IF}" == "none" ]]; then
  POG_EDGE_GAME_IF=""
fi

POG_EDGE_WG_PORT="${POG_EDGE_WG_PORT:-51820}"
# Bank-scoped overlay: hub 10.99.<bank>.1, spokes .2… — bank 0 = legacy bench pair.
POG_EDGE_OVERLAY_A="${POG_EDGE_OVERLAY_A:-10.99.${EDGE_BANK}.1}"
POG_EDGE_OVERLAY_B="${POG_EDGE_OVERLAY_B:-10.99.${EDGE_BANK}.2}"
WG_IF="${WG_IF:-wg0}"
GRETAP_IF="${GRETAP_IF:-gretap0}"

if [[ -z "${POG_EDGE_KEYS_DIR:-}" ]]; then
  POG_EDGE_KEYS_DIR="${POG_EDGE_ROOT}/keys/bench-office-pos4"
fi
if [[ -z "${POG_EDGE_WG_DIR:-}" ]]; then
  POG_EDGE_WG_DIR="/etc/wireguard"
fi

# Normalize topology + role.
# EDGE_TOPOLOGY=hub|spoke is preferred for wlan-star; peer-a/b remain single-hop aliases.
case "${EDGE_TOPOLOGY}" in
  hub|spoke) ;;
  "")
    case "${POG_EDGE_ROLE}" in
      office|peer-a|a|1) EDGE_TOPOLOGY="" ;; # single-hop unless set
      pos4|peer-b|b|4) EDGE_TOPOLOGY="" ;;
      hub) EDGE_TOPOLOGY=hub; POG_EDGE_ROLE=hub ;;
      spoke) EDGE_TOPOLOGY=spoke; POG_EDGE_ROLE=spoke ;;
    esac
    ;;
  *)
    echo "FATAL: EDGE_TOPOLOGY must be hub|spoke or empty (got ${EDGE_TOPOLOGY})" >&2
    exit 1
    ;;
esac

case "${POG_EDGE_ROLE}" in
  office|peer-a|a|1)
    POG_EDGE_ROLE=office
    POG_EDGE_LAN_IP="${POG_EDGE_LAN_IP:-${EDGE_UPLINK_IP:-}}"
    POG_EDGE_PEER_LAN_IP="${POG_EDGE_PEER_LAN_IP:-}"
    POG_EDGE_WG_CONF="${POG_EDGE_WG_CONF:-${POG_EDGE_WG_DIR}/wg0.conf}"
    POG_EDGE_BENCH_WG_SRC="${POG_EDGE_BENCH_WG_SRC:-${POG_EDGE_KEYS_DIR}/wg0.conf.office}"
    ;;
  pos4|peer-b|b|4)
    POG_EDGE_ROLE=pos4
    POG_EDGE_LAN_IP="${POG_EDGE_LAN_IP:-${EDGE_UPLINK_IP:-}}"
    POG_EDGE_PEER_LAN_IP="${POG_EDGE_PEER_LAN_IP:-}"
    POG_EDGE_WG_CONF="${POG_EDGE_WG_CONF:-${POG_EDGE_WG_DIR}/wg0.conf}"
    POG_EDGE_BENCH_WG_SRC="${POG_EDGE_BENCH_WG_SRC:-${POG_EDGE_KEYS_DIR}/wg0.conf.pos4}"
    ;;
  hub)
    POG_EDGE_ROLE=hub
    EDGE_TOPOLOGY=hub
    POG_EDGE_LAN_IP="${POG_EDGE_LAN_IP:-${EDGE_UPLINK_IP:-}}"
    POG_EDGE_WG_CONF="${POG_EDGE_WG_CONF:-${POG_EDGE_WG_DIR}/wg0.conf}"
    POG_EDGE_BENCH_WG_SRC="${POG_EDGE_BENCH_WG_SRC:-${POG_EDGE_KEYS_DIR}/wg0.conf.hub}"
    EDGE_BANK_WLAN="${EDGE_BANK_WLAN:-1}"
    ;;
  spoke)
    POG_EDGE_ROLE=spoke
    EDGE_TOPOLOGY=spoke
    POG_EDGE_LAN_IP="${POG_EDGE_LAN_IP:-${EDGE_UPLINK_IP:-}}"
    POG_EDGE_WG_CONF="${POG_EDGE_WG_CONF:-${POG_EDGE_WG_DIR}/wg0.conf}"
    POG_EDGE_BENCH_WG_SRC="${POG_EDGE_BENCH_WG_SRC:-${POG_EDGE_KEYS_DIR}/wg0.conf.spoke${EDGE_SPOKE_ID:-}}"
    EDGE_BANK_WLAN="${EDGE_BANK_WLAN:-1}"
    ;;
  *)
    if [[ -n "${POG_EDGE_ROLE}" ]]; then
      echo "FATAL: POG_EDGE_ROLE must be office|pos4|peer-a|peer-b|hub|spoke (got ${POG_EDGE_ROLE})" >&2
      exit 1
    fi
    ;;
esac

# SPE dropped from field options (LAN8670 is not galvanically isolated).
if [[ "${EDGE_UPLINK}" == "spe" ]]; then
  echo "FATAL: EDGE_UPLINK=spe is not supported (removed from field config)" >&2
  exit 1
fi

export EDGE_MODE EDGE_UPLINK EDGE_ROLE EDGE_GAME_IF EDGE_DHCP_ONCE
export EDGE_WIFI_SSID EDGE_WIFI_PSK EDGE_WIFI_CONN_NAME
export EDGE_TOPOLOGY EDGE_BANK EDGE_SPOKE_ID EDGE_BANK_WLAN EDGE_TID_UNICAST
export EDGE_SPOKE_STALE_S
export POG_EDGE_ROOT TIMING_ROOT POG_EDGE_ROLE POG_EDGE_LAN_IF POG_EDGE_GAME_IF
export POG_EDGE_LAN_IP POG_EDGE_PEER_LAN_IP POG_EDGE_WG_PORT
export POG_EDGE_OVERLAY_A POG_EDGE_OVERLAY_B WG_IF GRETAP_IF
export POG_EDGE_KEYS_DIR POG_EDGE_WG_DIR POG_EDGE_WG_CONF POG_EDGE_BENCH_WG_SRC

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

# Hub: list of active spoke gretaps (one per line) for ETH_PORTS fan-in.
if [[ -f "${POG_EDGE_ROOT}/.active_spoke_gretaps" ]]; then
  ACTIVE_SPOKE_GRETAPS="$(tr -d '\r' < "${POG_EDGE_ROOT}/.active_spoke_gretaps" | tr '\n' ',' | sed 's/,$//')"
  export ACTIVE_SPOKE_GRETAPS
fi
