#!/usr/bin/env bash
# Set EtherGold field role: topbox | listen | edge (mutually exclusive services).
#
# Usage:
#   sudo bash set_ethergold_role.sh topbox
#   sudo bash set_ethergold_role.sh listen
#   sudo bash set_ethergold_role.sh edge --role peer-a --uplink eth0
#
# Idempotent. Migrates legacy /etc/fixture → /etc/ethergold when present.

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"
if [[ -f "${SCRIPT_DIR}/../sync/ethergold_paths.sh" ]]; then
  # shellcheck source=../sync/ethergold_paths.sh
  source "${SCRIPT_DIR}/../sync/ethergold_paths.sh"
elif [[ -f "${HOME}/EtherGold/sync/ethergold_paths.sh" ]]; then
  # shellcheck source=/dev/null
  source "${HOME}/EtherGold/sync/ethergold_paths.sh"
fi

ROLE="${1:-}"
shift || true

# Optional display override (Atlas WiFi star keeps DyzineFrame while EDGE_MODE=1):
#   --display-on | --display-off
DISPLAY_OVERRIDE=""
EDGE_ARGS=()
while [[ $# -gt 0 ]]; do
  case "$1" in
    --display-on)
      DISPLAY_OVERRIDE=on
      shift
      ;;
    --display-off)
      DISPLAY_OVERRIDE=off
      shift
      ;;
    *)
      EDGE_ARGS+=("$1")
      shift
      ;;
  esac
done

if [[ -z "${ROLE}" ]]; then
  echo "FATAL: role required: topbox | listen | edge" >&2
  exit 1
fi
case "${ROLE}" in
  topbox|listen|edge) ;;
  *)
    echo "FATAL: unknown role '${ROLE}' (want topbox|listen|edge)" >&2
    exit 1
    ;;
esac

REAL_USER="${SUDO_USER:-topbox}"
POS="${FIXTURE_POS:-1}"

ethergold_migrate_legacy_paths
mkdir -p "${ETHERGOLD_ETC}" "${ETHERGOLD_VAR}" "${ETHERGOLD_LOGS:-/home/topbox/EtherGold/logs}"

{
  echo "ETHERGOLD_ROLE=${ROLE}"
} | tee "${ETHERGOLD_ROLE_FILE}" >/dev/null

# Stamp generated ethergold.env (preserve CHANNEL/UARTD if already set).
ENVF="${ETHERGOLD_ENV_FILE}"
touch "${ENVF}"
_upsert() {
  local key="$1" val="$2"
  if grep -q "^${key}=" "${ENVF}" 2>/dev/null; then
    sed -i "s|^${key}=.*|${key}=${val}|" "${ENVF}"
  else
    echo "${key}=${val}" >>"${ENVF}"
  fi
}
_upsert FIXTURE_POS "${POS}"
_upsert CHANNEL "${CHANNEL:-both}"
_upsert POG422_UARTD "${POG422_UARTD:-1}"
# Listen-only never drives the bus. Do not default inject=1 then "hope"
# install_collector setdefault fixes it — that key is already present.
case "${ROLE}" in
  listen) INJECT_DEFAULT=0 ;;
  *) INJECT_DEFAULT=1 ;;
esac
_upsert POG422_UARTD_INJECT "${POG422_UARTD_INJECT:-${INJECT_DEFAULT}}"
_upsert FIXTURE_STATUS_LED "${FIXTURE_STATUS_LED:-1}"
# Drop obsolete FIXTURE_MODE label
sed -i '/^FIXTURE_MODE=/d' "${ENVF}" 2>/dev/null || true

df_toggle() {
  local mode="$1" # enable|disable
  local df="${ETHERGOLD_SYNC:-${HOME}/EtherGold/sync}/disable_dyzineframe_autostart.sh"
  if [[ ! -f "${df}" ]]; then
    df="/home/${REAL_USER}/EtherGold/sync/disable_dyzineframe_autostart.sh"
  fi
  if [[ ! -f "${df}" ]]; then
    echo "WARN: disable_dyzineframe_autostart.sh missing — skip DyzineFrame toggle" >&2
    return 0
  fi
  if [[ "${mode}" == "enable" ]]; then
    sudo -u "${REAL_USER}" bash "${df}" --enable || true
  else
    sudo -u "${REAL_USER}" bash "${df}" || true
  fi
}

case "${ROLE}" in
  topbox)
    echo "=== role=topbox (copper bridge + DyzineFrame) ==="
    if [[ -f "${ETHERGOLD_EDGE_ENV}" ]] && grep -qE '^EDGE_MODE=1' "${ETHERGOLD_EDGE_ENV}" 2>/dev/null; then
      bash "${SCRIPT_DIR}/disable_edge.sh" || true
    else
      mkdir -p "${ETHERGOLD_ETC}"
      if [[ -f "${ETHERGOLD_EDGE_ENV}" ]]; then
        sed -i 's/^EDGE_MODE=.*/EDGE_MODE=0/' "${ETHERGOLD_EDGE_ENV}" 2>/dev/null || echo "EDGE_MODE=0" >>"${ETHERGOLD_EDGE_ENV}"
      else
        echo "EDGE_MODE=0" >"${ETHERGOLD_EDGE_ENV}"
      fi
    fi
    ethergold_stop_unit "${ETHERGOLD_COLLECTOR_UNIT}"
    ethergold_stop_unit "${ETHERGOLD_COLLECTOR_UNIT_LEGACY}"
    FIXTURE_POS="${POS}" bash "${SCRIPT_DIR}/install_prod_service.sh"
    df_toggle enable
    ;;
    listen)
    echo "=== role=listen (POG422 listen-only TopBox / OHD 1920x1080) ==="
    # Hard force: listen never injects, even if POG422_UARTD_INJECT was exported.
    _upsert POG422_UARTD_INJECT 0
    mkdir -p "${ETHERGOLD_ETC}"
    if [[ -f "${ETHERGOLD_EDGE_ENV}" ]]; then
      sed -i 's/^EDGE_MODE=.*/EDGE_MODE=0/' "${ETHERGOLD_EDGE_ENV}" 2>/dev/null || true
    else
      echo "EDGE_MODE=0" >"${ETHERGOLD_EDGE_ENV}"
    fi
    ethergold_stop_unit "${ETHERGOLD_UNIT}"
    ethergold_stop_unit "${ETHERGOLD_UNIT_LEGACY}"
    FIXTURE_POS="${POS}" bash "${SCRIPT_DIR}/install_collector_service.sh"
    df_toggle enable
    ;;
  edge)
    echo "=== role=edge (end-of-bank tunnel) ==="
    if [[ ${#EDGE_ARGS[@]} -eq 0 ]]; then
      echo "FATAL: edge requires enable_edge args, e.g. --role peer-a --uplink eth0" >&2
      exit 1
    fi
    ethergold_stop_unit "${ETHERGOLD_COLLECTOR_UNIT}"
    ethergold_stop_unit "${ETHERGOLD_COLLECTOR_UNIT_LEGACY}"
    FIXTURE_POS="${POS}" bash "${SCRIPT_DIR}/install_prod_service.sh"
    bash "${SCRIPT_DIR}/enable_edge.sh" "${EDGE_ARGS[@]}"
    # Transport (EDGE) and display (DyzineFrame) are independent for Atlas star.
    if [[ "${DISPLAY_OVERRIDE}" == "on" ]]; then
      df_toggle enable
    elif [[ "${DISPLAY_OVERRIDE}" == "off" ]]; then
      df_toggle disable
    else
      df_toggle disable
    fi
    ;;
esac

ethergold_retire_legacy_units
echo "ETHERGOLD_ROLE=${ROLE} written to ${ETHERGOLD_ROLE_FILE}"
echo "  systemctl status ${ETHERGOLD_UNIT}   # or ${ETHERGOLD_COLLECTOR_UNIT}"
cat "${ETHERGOLD_ROLE_FILE}"
