#!/usr/bin/env bash
# Idempotent seat / local-copper-witness identity for rclone + fixture-bridge.env.
#
# Convention:
#   seat bridge  N  → FIXTURE_POS=N   PI_LABEL=topboxN    CHANNEL=both    UPDATE_RUN=auto
#   local witness    → FIXTURE_POS=N1  PI_LABEL=topboxNw  CHANNEL=machine UPDATE_RUN=auto
#   (role/EDGE live in /etc/ethergold; start is always run_ethergold.sh)
#                       (N=1..5 → 11,21,31,41,51)
#
# Usage (on the Pi):
#   cd ~/EtherGold/sync
#   ROLE=witness SEAT=4 bash configure_fixture_role.sh
#   ROLE=bridge  SEAT=2 bash configure_fixture_role.sh
#   ROLE=witness FIXTURE_POS=41 PI_LABEL=topbox4w bash configure_fixture_role.sh
#
# Optional:
#   SET_HOSTNAME=1   — hostnamectl set-hostname topboxNw / topboxN (needs sudo)
#   SKIP_INSTALL_SYNC=1

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

SYNC="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=ethergold_paths.sh
source "${SYNC}/ethergold_paths.sh"

ROLE="${ROLE:-}"
SEAT="${SEAT:-}"
POS_IN="${FIXTURE_POS:-}"
LABEL_IN="${PI_LABEL:-}"
SET_HOSTNAME="${SET_HOSTNAME:-0}"
SKIP_INSTALL_SYNC="${SKIP_INSTALL_SYNC:-0}"

_upsert() {
  local key="$1" val="$2" file="$3"
  if [[ ! -f "${file}" ]]; then
    printf '%s=%s\n' "${key}" "${val}" >"${file}"
    return 0
  fi
  if grep -q $'\r' "${file}" 2>/dev/null; then
    sed -i 's/\r$//' "${file}" 2>/dev/null || true
  fi
  if grep -qE "^${key}=" "${file}" 2>/dev/null; then
    sed -i "s|^${key}=.*|${key}=${val}|" "${file}"
  else
    printf '%s=%s\n' "${key}" "${val}" >>"${file}"
  fi
}

_seat_from_witness_pos() {
  local p="$1"
  case "${p}" in
    11) echo 1 ;;
    21) echo 2 ;;
    31) echo 3 ;;
    41) echo 4 ;;
    51) echo 5 ;;
    *) return 1 ;;
  esac
}

_witness_pos_for_seat() {
  local s="$1"
  echo $((s * 10 + 1))
}

if [[ -z "${ROLE}" ]]; then
  echo "FATAL: set ROLE=witness or ROLE=bridge" >&2
  exit 1
fi
case "${ROLE}" in
  witness|bridge) ;;
  *)
    echo "FATAL: ROLE must be witness or bridge (got ${ROLE})" >&2
    exit 1
    ;;
esac

if [[ -n "${POS_IN}" ]]; then
  if [[ ! "${POS_IN}" =~ ^[1-9][0-9]?$ ]] || ((POS_IN < 1 || POS_IN > 99)); then
    echo "FATAL: FIXTURE_POS must be 1..99" >&2
    exit 1
  fi
fi

if [[ "${ROLE}" == "witness" ]]; then
  if [[ -n "${POS_IN}" ]]; then
    SEAT="$(_seat_from_witness_pos "${POS_IN}" || true)"
    if [[ -z "${SEAT}" ]]; then
      echo "FATAL: witness FIXTURE_POS must be 11,21,31,41, or 51 (N1 convention)" >&2
      exit 1
    fi
    POS="${POS_IN}"
  else
    if [[ -z "${SEAT}" ]] || [[ ! "${SEAT}" =~ ^[1-5]$ ]]; then
      echo "FATAL: witness needs SEAT=1..5 or FIXTURE_POS=11|21|31|41|51" >&2
      exit 1
    fi
    POS="$(_witness_pos_for_seat "${SEAT}")"
  fi
  LABEL="${LABEL_IN:-topbox${SEAT}w}"
  CHANNEL_VAL=machine
  UPDATE_RUN_VAL=auto
  HOSTNAME_VAL="topbox${SEAT}w"
else
  if [[ -n "${POS_IN}" ]] && [[ "${POS_IN}" =~ ^[1-5]$ ]]; then
    SEAT="${POS_IN}"
  elif [[ -z "${SEAT}" ]] || [[ ! "${SEAT}" =~ ^[1-5]$ ]]; then
    echo "FATAL: bridge needs SEAT=1..5 or FIXTURE_POS=1..5" >&2
    exit 1
  fi
  POS="${SEAT}"
  LABEL="${LABEL_IN:-topbox${SEAT}}"
  CHANNEL_VAL=both
  UPDATE_RUN_VAL=auto
  HOSTNAME_VAL="topbox${SEAT}"
fi

BRIDGE_ENV="${ETHERGOLD_ROOT}/fixture-bridge.env"
UPDATE_ENV="${ETHERGOLD_ROOT}/update.env"
RCLONE_ENV="${SYNC}/rclone.env"

if [[ ! -f "${BRIDGE_ENV}" ]]; then
  if [[ -f "${SYNC}/install_fixture_bridge_env.sh" ]]; then
    bash "${SYNC}/install_fixture_bridge_env.sh" --ensure || true
  fi
fi
if [[ ! -f "${BRIDGE_ENV}" && -f "${SYNC}/fixture_bridge.env.example" ]]; then
  cp "${SYNC}/fixture_bridge.env.example" "${BRIDGE_ENV}"
  chmod 644 "${BRIDGE_ENV}"
fi
if [[ ! -f "${BRIDGE_ENV}" ]]; then
  echo "FATAL: missing ${BRIDGE_ENV}" >&2
  exit 1
fi

_upsert FIXTURE_POS "${POS}" "${BRIDGE_ENV}"
_upsert PI_LABEL "${LABEL}" "${BRIDGE_ENV}"
_upsert CHANNEL "${CHANNEL_VAL}" "${BRIDGE_ENV}"
_upsert FIXTURE_MODE debug "${BRIDGE_ENV}"
_upsert POG422_UARTD 1 "${BRIDGE_ENV}"
_upsert POG422_UARTD_CAPTURE 1 "${BRIDGE_ENV}"
_upsert POG422_UARTD_INJECT 1 "${BRIDGE_ENV}"

if [[ ! -f "${UPDATE_ENV}" && -f "${SYNC}/update.env.example" ]]; then
  cp "${SYNC}/update.env.example" "${UPDATE_ENV}"
  chmod 644 "${UPDATE_ENV}"
fi
if [[ -f "${UPDATE_ENV}" ]]; then
  _upsert UPDATE_RUN "${UPDATE_RUN_VAL}" "${UPDATE_ENV}"
fi

if [[ -f "${RCLONE_ENV}" ]]; then
  _upsert FIXTURE_POS "${POS}" "${RCLONE_ENV}"
fi

if [[ "${SKIP_INSTALL_SYNC}" != "1" ]]; then
  FIXTURE_POS="${POS}" bash "${SYNC}/install_sync.sh"
fi

if [[ "${SET_HOSTNAME}" == "1" ]]; then
  cur="$(hostname -s 2>/dev/null || hostname)"
  if [[ "${cur}" != "${HOSTNAME_VAL}" ]]; then
    echo "Setting hostname ${cur} → ${HOSTNAME_VAL}"
    sudo hostnamectl set-hostname "${HOSTNAME_VAL}"
  else
    echo "Hostname already ${HOSTNAME_VAL}"
  fi
fi

echo ""
echo "configure_fixture_role: ROLE=${ROLE} SEAT=${SEAT} FIXTURE_POS=${POS} PI_LABEL=${LABEL}"
echo "  CHANNEL=${CHANNEL_VAL}  UPDATE_RUN=${UPDATE_RUN_VAL}"
echo "  fixture-bridge.env:"
grep -E '^(FIXTURE_POS|PI_LABEL|CHANNEL|FIXTURE_MODE)=' "${BRIDGE_ENV}" || true
if [[ -f "${RCLONE_ENV}" ]]; then
  echo "  rclone.env:"
  grep -E '^(FIXTURE_POS|DROPBOX_DEST)=' "${RCLONE_ENV}" || true
fi
echo ""
if [[ "${ROLE}" == "witness" ]]; then
  echo "Start (foreground — do not also run bridge/prod on this Pi):"
  echo "  cd ~/EtherGold/dev && FIXTURE_POS=${POS} PI_LABEL=${LABEL} bash run_listen_jun11_good.sh"
  echo "Stop any fixture-prod / bridge first if UART is busy."
else
  echo "Start (foreground):"
  echo "  cd ~/EtherGold/dev && CHANNEL=both FIXTURE_POS=${POS} PI_LABEL=${LABEL} bash run_bridge_jun11_good.sh"
fi
