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

MEDIA_NODE="${1:-/run/epc670/media}"
VIDEO_NODE="${2:-/run/epc670/video}"

# Tunables (override via env)
WIDTH="${WIDTH:-320}"
HEIGHT="${HEIGHT:-240}"
SENSOR_ENTITY="${SENSOR_ENTITY:-epc670 11-003c}"
CSI2_ENTITY="${CSI2_ENTITY:-csi2}"
CAPTURE_ENTITY="${CAPTURE_ENTITY:-rp1-cfe-csi2_ch0}"

# Wait a bit for the resolver/service to populate /run/epc670
for ((i=0; i<50; i++)); do
  [[ -e "$MEDIA_NODE" && -e "$VIDEO_NODE" ]] && break
  sleep 0.1
done

if [[ ! -e "$MEDIA_NODE" || ! -e "$VIDEO_NODE" ]]; then
  echo "ERROR: missing nodes: MEDIA_NODE=$MEDIA_NODE VIDEO_NODE=$VIDEO_NODE" >&2
  exit 1
fi

topo="$(media-ctl -d "$MEDIA_NODE" -p)"

# Sanity checks (fail fast with useful messages)
printf '%s\n' "$topo" | grep -Fq ": $CSI2_ENTITY (" || { echo "ERROR: entity not found: $CSI2_ENTITY" >&2; exit 1; }
printf '%s\n' "$topo" | grep -Fq ": $CAPTURE_ENTITY (" || { echo "ERROR: entity not found: $CAPTURE_ENTITY" >&2; exit 1; }
printf '%s\n' "$topo" | grep -Fq ": $SENSOR_ENTITY (" || { echo "ERROR: entity not found: $SENSOR_ENTITY" >&2; exit 1; }

echo "Configuring media device: $MEDIA_NODE"
echo "  Sensor : '$SENSOR_ENTITY'"
echo "  Route  : '$CSI2_ENTITY':4 -> '$CAPTURE_ENTITY':0"
echo "  Format : ${WIDTH}x${HEIGHT}"

media-ctl -d "$MEDIA_NODE" -l "'$CSI2_ENTITY':4 -> '$CAPTURE_ENTITY':0[1]"
media-ctl -d "$MEDIA_NODE" -V "'$CSI2_ENTITY':0 [fmt:Y12_1X12/${WIDTH}x${HEIGHT} field:none],'$CSI2_ENTITY':4 [fmt:Y16_1X16/${WIDTH}x${HEIGHT} field:none]"
v4l2-ctl --device $VIDEO_NODE -v width=${WIDTH},height=${HEIGHT},pixelformat='Y16 ' -V