#!/usr/bin/env bash
# Enable POG-EDGE mode (end-of-bank tunnel endpoint). Restarts ethergold.service.
#
# Usage:
#   sudo bash enable_edge.sh --role peer-a --uplink eth0
#   sudo bash enable_edge.sh --role peer-b --uplink wlan0 --wifi-psk 'secret'
#   sudo bash enable_edge.sh --game-if eth1          # keep local game leg (default)
#   sudo bash enable_edge.sh --game-if none         # gretap-only (tunnel replaces copper)
#
# Disable: sudo bash disable_edge.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

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

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=ethergold_field_env.sh
source "${SCRIPT_DIR}/ethergold_field_env.sh"
ethergold_migrate_legacy_paths
EDGE_ENV="$(ethergold_resolve_edge_env)"
EDGE_EXAMPLE="${SCRIPT_DIR}/pog-edge/edge.env.example"

ROLE=""
UPLINK="eth0"
GAME_IF="eth1"
WIFI_PSK=""
DHCP_ONCE="1"

while [[ $# -gt 0 ]]; do
  case "$1" in
    --role) ROLE="$2"; shift 2 ;;
    --uplink) UPLINK="$2"; shift 2 ;;
    --game-if)
      if [[ "$2" == "none" ]]; then GAME_IF=""; else GAME_IF="$2"; fi
      shift 2
      ;;
    --wifi-psk) WIFI_PSK="$2"; shift 2 ;;
    --dhcp-once) DHCP_ONCE="$2"; shift 2 ;;
    -h|--help)
      sed -n '1,12p' "${BASH_SOURCE[0]}"
      exit 0
      ;;
    *)
      echo "Unknown option: $1" >&2
      exit 1
      ;;
  esac
done

if [[ -z "${ROLE}" ]]; then
  echo "FATAL: --role peer-a|peer-b required" >&2
  exit 1
fi

case "${ROLE}" in
  peer-a|peer-b|office|pos4) ;;
  *)
    echo "FATAL: --role must be peer-a|peer-b (or office|pos4)" >&2
    exit 1
    ;;
esac

if [[ "${UPLINK}" != "eth0" && "${UPLINK}" != wlan* ]]; then
  echo "FATAL: --uplink must be eth0 or wlanN" >&2
  exit 1
fi

if [[ "${UPLINK}" == wlan* && -z "${WIFI_PSK}" ]]; then
  if [[ -f "${EDGE_ENV}" ]] && grep -q '^EDGE_WIFI_PSK=' "${EDGE_ENV}"; then
    :
  else
    echo "FATAL: --wifi-psk required for ${UPLINK} uplink (or set EDGE_WIFI_PSK in edge.env)" >&2
    exit 1
  fi
fi

mkdir -p "${ETHERGOLD_ETC}"
if [[ ! -f "${EDGE_ENV}" && -f "${EDGE_EXAMPLE}" ]]; then
  cp "${EDGE_EXAMPLE}" "${ETHERGOLD_EDGE_ENV}"
  EDGE_ENV="${ETHERGOLD_EDGE_ENV}"
fi
# Always write new path going forward
EDGE_ENV="${ETHERGOLD_EDGE_ENV}"
mkdir -p "$(dirname "${EDGE_ENV}")"
if [[ ! -f "${EDGE_ENV}" && -f "${EDGE_EXAMPLE}" ]]; then
  cp "${EDGE_EXAMPLE}" "${EDGE_ENV}"
fi
if [[ ! -f "${EDGE_ENV}" ]]; then
  echo "EDGE_MODE=0" >"${EDGE_ENV}"
fi

update_kv() {
  local key="$1" val="$2"
  if grep -q "^${key}=" "${EDGE_ENV}" 2>/dev/null; then
    sed -i "s|^${key}=.*|${key}=${val}|" "${EDGE_ENV}"
  else
    echo "${key}=${val}" >> "${EDGE_ENV}"
  fi
}

update_kv EDGE_MODE 1
update_kv EDGE_ROLE "${ROLE}"
update_kv EDGE_UPLINK "${UPLINK}"
update_kv EDGE_GAME_IF "${GAME_IF}"
update_kv EDGE_DHCP_ONCE "${DHCP_ONCE}"
if [[ -n "${WIFI_PSK}" ]]; then
  update_kv EDGE_WIFI_PSK "${WIFI_PSK}"
fi

if ! command -v wg >/dev/null 2>&1; then
  echo "Installing wireguard..."
  apt-get update -qq && apt-get install -y wireguard
fi

bash "${SCRIPT_DIR}/install_edge_sudoers.sh"

echo "--- NetworkManager: re-manage EDGE_UPLINK=${UPLINK}, keep game unmanaged ---"
NM_INSTALL="${SCRIPT_DIR}/install_nm_eth_unmanaged.sh"
if [[ -f "${NM_INSTALL}" ]]; then
  bash "${NM_INSTALL}" --edge-uplink "${UPLINK}" --edge-game "${GAME_IF}"
else
  echo "WARN: ${NM_INSTALL} missing — uplink may stay unmanaged" >&2
fi

echo "=== edge enabled ==="
grep -E '^EDGE_' "${EDGE_ENV}" || true
if [[ ! -f "${ETHERGOLD_ROLE_FILE}" ]] || ! grep -q '^ETHERGOLD_ROLE=edge' "${ETHERGOLD_ROLE_FILE}" 2>/dev/null; then
  echo "ETHERGOLD_ROLE=edge" >"${ETHERGOLD_ROLE_FILE}"
fi
ethergold_restart_bridge_unit
