#!/bin/bash
# Copyright (C) 2026 Ralf Burger — GPL v3
# obd_identify.sh -- Identifiziert obdBT-Module an /dev/ttyUSBx
#                    Lokal oder remote via SSH
#
# Verwendung:
#   ./obd_identify.sh                        # alle /dev/ttyUSB*
#   ./obd_identify.sh /dev/ttyUSB0 /dev/ttyUSB1
#   ./obd_identify.sh --reboot               # Board neu starten für sauberen Banner
#   ./obd_identify.sh --remote               # auf PC2 (Standard: root@192.168.28.16)
#   ./obd_identify.sh --remote user@host     # auf beliebigem Host

PC2_HOST="192.168.28.16"
PC2_USER="root"

REBOOT=0
REMOTE=0
REMOTE_TARGET=""
PORTS=()

for arg in "$@"; do
  case "$arg" in
    --reboot)   REBOOT=1 ;;
    --remote)   REMOTE=1 ;;
    --help|-h)
      echo "Verwendung: $0 [--reboot] [--remote [user@host]] [/dev/ttyUSBx ...]"
      exit 0 ;;
    *@*)        REMOTE_TARGET="$arg"; REMOTE=1 ;;
    /dev/tty*)  PORTS+=("$arg") ;;
  esac
done

[ -z "$REMOTE_TARGET" ] && REMOTE_TARGET="$PC2_USER@$PC2_HOST"

# -- Remote-Modus: Script auf PC2 ausführen ---------------------------
if [ "$REMOTE" -eq 1 ]; then
  echo ""
  echo "  obdBT Modul-Erkennung  |  Remote: $REMOTE_TARGET"
  echo ""
  SCRIPT_PATH="$(realpath "$0")"
  REMOTE_ARGS=""
  [ "$REBOOT" -eq 1 ] && REMOTE_ARGS="--reboot"
  [ ${#PORTS[@]} -gt 0 ] && REMOTE_ARGS="$REMOTE_ARGS ${PORTS[*]}"
  # Script hochladen und remote ausführen
  ssh "$REMOTE_TARGET" "cat > /tmp/obd_identify_remote.sh" < "$SCRIPT_PATH"
  ssh "$REMOTE_TARGET" "chmod +x /tmp/obd_identify_remote.sh && \
    /tmp/obd_identify_remote.sh $REMOTE_ARGS" | \
    sed "s|./obd_flash.sh|./obd_flash.sh|g"
  # Flash-Hinweis anpassen
  echo ""
  echo -e "  \033[2mHinweis: Flash-Befehl oben ist für $REMOTE_TARGET.\033[0m"
  echo -e "  \033[2mFür lokales Flashen via PC2: obd_flash.sh ohne --local\033[0m"
  echo ""
  exit 0
fi

# -- Lokale Erkennung -------------------------------------------------
if [ ${#PORTS[@]} -eq 0 ]; then
  mapfile -t PORTS < <(ls /dev/ttyUSB* 2>/dev/null | sort)
  [ ${#PORTS[@]} -eq 0 ] && { echo "Keine /dev/ttyUSB* gefunden."; exit 1; }
fi

GRN='\033[0;32m'; YLW='\033[1;33m'; RED='\033[0;31m'
BLU='\033[0;34m'; DIM='\033[2m'; NC='\033[0m'

echo ""
echo -e "  obdBT Modul-Erkennung  |  Ports: ${PORTS[*]}"
echo ""

# Erkannte Zuordnungen: key -> liste von ports (für Duplikate)
declare -A FOUND_PORTS_BY_KEY   # FOUND_PORTS_BY_KEY[bridge]="/dev/ttyUSB1 /dev/ttyUSB3"

for port in "${PORTS[@]}"; do
  echo -e "  ${YLW}-- $port${NC}"

  if [ ! -c "$port" ]; then
    echo -e "  ${RED}x${NC}  nicht gefunden"; echo ""; continue
  fi

  stty -F "$port" 115200 cs8 -cstopb -parenb raw -echo 2>/dev/null

  if [ "$REBOOT" -eq 1 ]; then
    python3 -c \
      "import serial,time; s=serial.Serial('$port',115200); \
       s.dtr=False; time.sleep(0.3); s.dtr=True; s.close()" 2>/dev/null
    sleep 12
  fi

  tmpfile=$(mktemp)
  timeout 8 cat "$port" 2>/dev/null | tr '\r' '\n' | tr -cd '[:print:]\n' > "$tmpfile" &
  CAT_PID=$!
  sleep 0.3
  for i in 1 2 3 4 5; do
    printf "s\r\n" > "$port" 2>/dev/null
    sleep 1
  done
  wait $CAT_PID 2>/dev/null
  raw=$(cat "$tmpfile"); rm -f "$tmpfile"

  if [ "${DEBUG:-0}" = "1" ]; then
    echo "--- RAW ---"; echo "$raw" | head -30 | sed 's/^/  /'; echo "-----------"
  fi

  header=$(echo "$raw" | grep "^=== obdBT" | head -1)
  if [ -z "$header" ]; then
    echo -e "  ${RED}x${NC}  Kein obdBT-Modul erkannt"; echo ""; continue
  fi

  module=$(echo "$header" | sed 's/=== obdBT //;s/ ===//' | awk '{print $1}')
  version=$(echo "$header" | grep -o 'v[0-9][0-9.]*')
  echo -e "  ${GRN}+${NC}  Modul : ${GRN}${module}${NC} ${DIM}${version}${NC}"

  wifi_line=$(echo "$raw" | grep "^  WiFi:" | head -1)
  wifi_mode=$(echo "$wifi_line" | grep -o 'STA\|AP')
  ip=$(echo "$wifi_line" | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' \
       | grep -v '^0\.0\.0\.0$' | head -1)
  tcp=$(echo "$raw" | grep "^  Port:\|^  Telnet:" | grep -o '[0-9]\{4,5\}' | head -1)
  [ -z "$tcp" ] && tcp="1234"

  if [ -n "$ip" ]; then
    echo -e "  ${GRN}+${NC}  WiFi  : ${wifi_mode:-?}  ${GRN}${ip}${NC}   nc ${ip} ${tcp}"
  elif [ -n "$wifi_mode" ]; then
    echo -e "  ${BLU}i${NC}  WiFi  : ${wifi_mode}  0.0.0.0 (DHCP ausstehend)"
  elif echo "$wifi_line" | grep -q "kein"; then
    echo -e "     WiFi  : kein WiFi"
  fi

  # Board-Schlüssel ableiten
  case "$module" in
    Bridge)    flash_key="bridge"    ;;
    LoRa)      flash_key="receiver"  ;;
    Simulator) flash_key="simulator" ;;
    *)         flash_key=""          ;;
  esac

  if [ -n "$flash_key" ]; then
    if [ -n "${FOUND_PORTS_BY_KEY[$flash_key]}" ]; then
      FOUND_PORTS_BY_KEY[$flash_key]+=" $port"
    else
      FOUND_PORTS_BY_KEY[$flash_key]="$port"
    fi
  fi

  echo ""
done

# -- Flash-Befehl generieren ------------------------------------------
if [ ${#FOUND_PORTS_BY_KEY[@]} -eq 0 ]; then
  [ "$REBOOT" -eq 0 ] && echo -e "  ${DIM}Tipp:  --reboot für sauberen Banner-Empfang${NC}"
  echo -e "  ${DIM}Debug: export DEBUG=1; ./obd_identify.sh${NC}"
  echo ""
  exit 0
fi

# Prüfen ob Duplikate vorhanden
has_duplicates=0
for key in "${!FOUND_PORTS_BY_KEY[@]}"; do
  count=$(echo "${FOUND_PORTS_BY_KEY[$key]}" | wc -w)
  [ "$count" -gt 1 ] && has_duplicates=1
done

echo -e "  ${YLW}Flash-Befehl:${NC}"

if [ "$has_duplicates" -eq 0 ]; then
  # Einfacher Fall: jeder Typ genau einmal
  port_args=""
  boards=""
  for key in bridge receiver simulator; do
    if [ -n "${FOUND_PORTS_BY_KEY[$key]}" ]; then
      port_args+=" --port ${key}=${FOUND_PORTS_BY_KEY[$key]}"
      boards+=" $key"
    fi
  done
  echo -e "  ${GRN}./obd_flash.sh${port_args}${boards}${NC}"
else
  # Duplikate: nummerierte Instanzen ausgeben
  echo -e "  ${YLW}Achtung: Mehrere Geräte des gleichen Typs erkannt.${NC}"
  echo -e "  ${YLW}Ports für nummerierte Instanzen (N=0,1,...):${NC}"
  echo ""
  port_args=""
  boards=""
  for key in bridge receiver simulator; do
    [ -z "${FOUND_PORTS_BY_KEY[$key]}" ] && continue
    read -ra key_ports <<< "${FOUND_PORTS_BY_KEY[$key]}"
    count=${#key_ports[@]}
    if [ "$count" -eq 1 ]; then
      port_args+=" --port ${key}=${key_ports[0]}"
      boards+=" $key"
    else
      for i in "${!key_ports[@]}"; do
        port_args+=" --port ${key}:${i}=${key_ports[$i]}"
        boards+=" ${key}:${i}"
        echo -e "  ${DIM}  ${key}:${i}  →  ${key_ports[$i]}${NC}"
      done
    fi
  done
  echo ""
  echo -e "  ${GRN}./obd_flash.sh${port_args}${boards}${NC}"
fi

echo ""
[ "$REBOOT" -eq 0 ] && echo -e "  ${DIM}Tipp:  --reboot für sauberen Banner-Empfang${NC}"
echo -e "  ${DIM}Debug: export DEBUG=1; ./obd_identify.sh${NC}"
echo ""
