#!/usr/bin/env bash
set -euo pipefail

CREATE_LINKS="${CREATE_LINKS:-0}"
SUBDEV_NODE="${SUBDEV_NODE:-/dev/epc670_subdev}"
SENSOR_GREP="${SENSOR_GREP:-epc670 11-003c|epc670}"
LINK_DIR="${LINK_DIR:-/run/epc670}"

for arg in "$@"; do
  case "$arg" in
    --link) CREATE_LINKS=1 ;;
    *)
      echo "Usage: $0 [--link]" >&2
      exit 2
      ;;
  esac
done

log() {
  echo "[epc670-resolve] $*"
}

cleanup_links() {
  rm -f "$LINK_DIR/media" "$LINK_DIR/video" "$LINK_DIR/subdev"
}

# Try a few times because media graph creation can lag behind hotplug
TRIES="${TRIES:-10}"
SLEEP_SEC="${SLEEP_SEC:-0.5}"

MEDIA_NODE=""
VIDEO_NODE=""

for ((i=1; i<=TRIES; i++)); do
  log "probe attempt $i/$TRIES"

  MEDIA_NODE=""
  VIDEO_NODE=""

  # pick the rp1-cfe graph that contains the sensor entity
  for m in /dev/media*; do
    [[ -e "$m" ]] || continue
    topo="$(media-ctl -d "$m" -p 2>/dev/null || true)"

    if echo "$topo" | grep -q 'driver[[:space:]]*rp1-cfe' &&
       echo "$topo" | grep -Eq "$SENSOR_GREP"; then
      MEDIA_NODE="$m"
      break
    fi
  done


# Extract the first capture-capable /dev/videoX that belongs to this media graph.
# (Some graphs expose multiple /dev/video*; we choose the first with Video Capture capability.)
  if [[ -n "$MEDIA_NODE" ]]; then
    while read -r v; do
      [[ -n "$v" ]] || continue
      if v4l2-ctl -d "$v" --all 2>/dev/null | grep -q "Video Capture"; then
        VIDEO_NODE="$v"
        break
      fi
    done < <(
      media-ctl -d "$MEDIA_NODE" -p 2>/dev/null |
        awk '/device node name \/dev\/video/ {print $4}' |
        sort -u
    )
  fi

  if [[ -n "$MEDIA_NODE" && -n "$VIDEO_NODE" ]]; then
    break
  fi

  sleep "$SLEEP_SEC"
done

if [[ -z "$MEDIA_NODE" || -z "$VIDEO_NODE" ]]; then
  log "graph not ready yet; nothing to publish"
  if [[ "$CREATE_LINKS" -eq 1 ]]; then
    mkdir -p "$LINK_DIR"
    cleanup_links
  fi
  exit 0
fi

log "MEDIA_NODE=$MEDIA_NODE"
log "VIDEO_NODE=$VIDEO_NODE"

if [[ -e "$SUBDEV_NODE" ]]; then
  log "SUBDEV_NODE=$SUBDEV_NODE"
else
  log "SUBDEV_NODE missing: $SUBDEV_NODE"
fi

if [[ "$CREATE_LINKS" -eq 1 ]]; then
  mkdir -p "$LINK_DIR"

  ln -sfn "$MEDIA_NODE" "$LINK_DIR/media"
  ln -sfn "$VIDEO_NODE" "$LINK_DIR/video"

  if [[ -e "$SUBDEV_NODE" ]]; then
    ln -sfn "$SUBDEV_NODE" "$LINK_DIR/subdev"
  else
    rm -f "$LINK_DIR/subdev"
  fi

  log "published links in $LINK_DIR"
  log "  $LINK_DIR/media  -> $MEDIA_NODE"
  log "  $LINK_DIR/video  -> $VIDEO_NODE"
  if [[ -e "$LINK_DIR/subdev" ]]; then
    log "  $LINK_DIR/subdev -> $SUBDEV_NODE"
  fi
fi

exit 0