#!/usr/bin/env bash
# One-time Pi migration: 4-Board Test Fixture/ → field layout under ~/EtherGold/.
#
# Run on Pi (after PC deploy pushed bridge/ + Daemon/ + sync/):
#   cd ~/EtherGold/sync && bash migrate_field_layout.sh
#
# From PC:
#   orchestrate_fixture.ps1 -Action migrate-field
#
# Idempotent — safe to re-run; archives legacy tree when done.

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"

REAL_USER="${SUDO_USER:-${USER:-topbox}}"

echo "=== migrate_field_layout ==="
echo "Hostname: $(hostname -s 2>/dev/null || hostname)"
echo "Target:   ${ETHERGOLD_ROOT}/{bridge,Daemon,logs,sync}"
echo ""

mkdir -p "${ETHERGOLD_BRIDGE}" "${ETHERGOLD_DAEMON}" "${ETHERGOLD_LOGS}" "${ETHERGOLD_SYNC}"

if [[ -d "${ETHERGOLD_LEGACY_TIMING}" ]]; then
  LEGACY_TIMING="${ETHERGOLD_LEGACY_TIMING}"
  LEGACY_SYNC="${ETHERGOLD_LEGACY_FIXTURE}/sync"
  echo "Legacy timing: ${LEGACY_TIMING}"
else
  LEGACY_TIMING=""
  LEGACY_SYNC=""
  echo "No legacy fixture-timing tree — assuming deploy already landed under bridge/Daemon."
fi

echo "--- stop prod / bridge workers ---"
if systemctl is-active fixture-prod >/dev/null 2>&1; then
  sudo systemctl stop fixture-prod || true
fi
if [[ -n "${LEGACY_TIMING}" && -f "${LEGACY_TIMING}/jun11-prod/disable_prod.sh" ]]; then
  sudo -u "${REAL_USER}" env FIXTURE_POS="${FIXTURE_POS:-1}" bash "${LEGACY_TIMING}/jun11-prod/disable_prod.sh" || true
elif [[ -f "${ETHERGOLD_DAEMON}/disable_prod.sh" ]]; then
  sudo -u "${REAL_USER}" env FIXTURE_POS="${FIXTURE_POS:-1}" bash "${ETHERGOLD_DAEMON}/disable_prod.sh" || true
fi
for pattern in pog422_fixture_bridge pog422_fixture_listen fixture_link_watch fixture_supervisor; do
  pkill -TERM -f "${pattern}" 2>/dev/null || true
done
sleep 1
for pattern in pog422_fixture_bridge pog422_fixture_listen fixture_link_watch fixture_supervisor; do
  pkill -KILL -f "${pattern}" 2>/dev/null || true
done

copy_tree() {
  local src="$1" dst="$2"
  [[ -d "${src}" ]] || return 0
  mkdir -p "${dst}"
  if command -v rsync >/dev/null 2>&1; then
    rsync -a --ignore-existing "${src}/" "${dst}/"
  else
    cp -a "${src}/." "${dst}/" 2>/dev/null || true
  fi
}

if [[ -n "${LEGACY_TIMING}" ]]; then
  echo "--- migrate runtime → bridge/ ---"
  copy_tree "${LEGACY_TIMING}/jun11-good" "${ETHERGOLD_BRIDGE}/jun11-good"
  copy_tree "${LEGACY_TIMING}/inject-shim" "${ETHERGOLD_BRIDGE}/inject-shim"
  for sh in ensure_tty_xrusb.sh run_bridge_jun11_good.sh run_listen_jun11_good.sh \
    start_bridge_background.sh stop_fixture_session.sh run_bridge_prod.sh; do
    if [[ -f "${LEGACY_TIMING}/${sh}" ]]; then
      cp -a "${LEGACY_TIMING}/${sh}" "${ETHERGOLD_BRIDGE}/${sh}" 2>/dev/null || true
    fi
    if [[ -f "${LEGACY_TIMING}/jun11-prod/${sh}" ]]; then
      cp -a "${LEGACY_TIMING}/jun11-prod/${sh}" "${ETHERGOLD_BRIDGE}/${sh}" 2>/dev/null || true
    fi
  done
  for sh in "${LEGACY_TIMING}"/*.sh; do
    [[ -f "${sh}" ]] || continue
    base="$(basename "${sh}")"
    case "${base}" in
      prep_eth_for_fixture.sh) cp -a "${sh}" "${ETHERGOLD_DAEMON}/${base}" ;;
      *) cp -a "${sh}" "${ETHERGOLD_BRIDGE}/${base}" 2>/dev/null || true ;;
    esac
  done

  echo "--- migrate Daemon/ (driver + prod scripts) ---"
  copy_tree "${LEGACY_TIMING}/jun11-prod" "${ETHERGOLD_DAEMON}"
  copy_tree "${LEGACY_TIMING}/xr-usb-serial-pog422" "${ETHERGOLD_DAEMON}/xr-usb-serial-pog422"
  if [[ -f "${LEGACY_TIMING}/prep_eth_for_fixture.sh" ]]; then
    cp -a "${LEGACY_TIMING}/prep_eth_for_fixture.sh" "${ETHERGOLD_DAEMON}/"
  fi
  rm -f "${ETHERGOLD_DAEMON}/run_bridge_prod.sh" 2>/dev/null || true

  echo "--- migrate sync/ ---"
  if [[ -d "${LEGACY_SYNC}" ]]; then
    copy_tree "${LEGACY_SYNC}" "${ETHERGOLD_SYNC}"
  fi

  echo "--- migrate logs ---"
  if [[ -f "${LEGACY_TIMING}/prod-data/errors.jsonl" ]]; then
    cp -a "${LEGACY_TIMING}/prod-data/errors.jsonl" "${ETHERGOLD_LOGS}/errors.jsonl"
  fi
  for sup in "${LEGACY_TIMING}"/logs/prod_supervisor_pos*.log; do
    [[ -f "${sup}" ]] || continue
    cp -a "${sup}" "${ETHERGOLD_LOGS}/supervisor.log"
    break
  done
fi

if [[ -f "${ETHERGOLD_ROOT}/progressives.csv" ]]; then
  echo "OK: ${ETHERGOLD_PROGRESSIVES_CSV}"
else
  for cand in \
    "${ETHERGOLD_LEGACY_TIMING}/../progressives.csv" \
    "${ETHERGOLD_ROOT}/EtherGold_Progs.csv"; do
    if [[ -f "${cand}" ]]; then
      cp -a "${cand}" "${ETHERGOLD_PROGRESSIVES_CSV}"
      echo "Copied progressives → ${ETHERGOLD_PROGRESSIVES_CSV}"
      break
    fi
  done
fi

mkdir -p "${ETHERGOLD_LOGS}"
touch "${ETHERGOLD_LOGS}/errors.jsonl" "${ETHERGOLD_LOGS}/supervisor.log" 2>/dev/null || true

echo "--- normalize script permissions ---"
if [[ -f "${ETHERGOLD_SYNC}/pi_normalize.sh" ]]; then
  bash "${ETHERGOLD_SYNC}/pi_normalize.sh" || true
fi

if [[ -n "${LEGACY_TIMING}" && -d "${ETHERGOLD_LEGACY_FIXTURE}" ]]; then
  ARCHIVE="${ETHERGOLD_ROOT}/_archive/legacy-4-board-test-fixture-$(date -u +%Y%m%dT%H%M%SZ)"
  echo "--- archive legacy tree → ${ARCHIVE} ---"
  mkdir -p "${ETHERGOLD_ROOT}/_archive"
  if [[ ! -d "${ARCHIVE}" ]]; then
    mv "${ETHERGOLD_LEGACY_FIXTURE}" "${ARCHIVE}"
  fi
fi

POS="${FIXTURE_POS:-}"
if [[ -z "${POS}" ]] && [[ -f /etc/fixture/fixture-pos.env ]]; then
  # shellcheck source=/dev/null
  source /etc/fixture/fixture-pos.env
  POS="${FIXTURE_POS:-}"
fi
if [[ -z "${POS}" ]]; then
  case "$(hostname -s 2>/dev/null || hostname)" in
    topbox1) POS=1 ;;
    topbox2) POS=2 ;;
    topbox3) POS=3 ;;
    topbox4) POS=4 ;;
    topbox5) POS=5 ;;
    *) POS=1 ;;
  esac
fi

if [[ -x "${ETHERGOLD_DAEMON}/install_prod_service.sh" ]]; then
  echo "--- reinstall fixture-prod.service (pos ${POS}) ---"
  sudo env FIXTURE_POS="${POS}" bash "${ETHERGOLD_DAEMON}/install_prod_service.sh"
else
  echo "WARN: ${ETHERGOLD_DAEMON}/install_prod_service.sh missing — run deploy first" >&2
fi

echo ""
echo "=== migrate_field_layout complete ==="
echo "  ls -la ${ETHERGOLD_ROOT}"
echo "  systemctl status fixture-prod"
echo "  tail -f ${ETHERGOLD_LOGS}/supervisor.log"
