// App.jsx — Root component: state management + TTN poll orchestration
var { useState, useEffect, useCallback, useRef } = React;

var POLL_INTERVAL = 10000;

function App() {
  var [sensorData, setSensorData] = useState({ laser: null, ultrason: null });
  var [pollStatus, setPollStatus] = useState("loading");
  var [lastPoll, setLastPoll] = useState(null);
  var [corsMode, setCorsMode] = useState("direct");
  var [selected, setSelected] = useState(null);
  var pollCount = useRef(0);

  var doPoll = useCallback(function () {
    var cycle = ++pollCount.current;
    console.log("[POLL] ─── Cycle", cycle, "starting ───");
    setPollStatus("loading");

    window.TTN_poll("2m").then(function (result) {
      console.log("[POLL] Cycle", cycle, "complete:", result.error ? "ERROR" : "OK");
      var now = new Date().toISOString();
      setLastPoll(now);
      setCorsMode(result.corsMode);

      if (result.error) {
        console.error("[STATE] Poll error:", result.error);
        setPollStatus("error");
        return;
      }

      setPollStatus("ok");
      var sensors = result.sensors;
      var newData = { laser: null, ultrason: null };

      if (sensors.laser) {
        var laserDetect = window.detectLayers(sensors.laser.distance_mm, "laser");
        newData.laser = {
          distance_mm: sensors.laser.distance_mm,
          received_at: sensors.laser.received_at,
          layers: laserDetect.layers,
          confidence: laserDetect.confidence,
          flag: laserDetect.flag,
          residual: laserDetect.residual,
          raw_payload: sensors.laser.raw_payload,
        };
        console.log("[STATE] Laser updated:", JSON.stringify(newData.laser));
      } else {
        console.log("[STATE] No laser data in this poll cycle");
      }

      if (sensors.ultrason) {
        var ultraDetect = window.detectLayers(sensors.ultrason.distance_mm, "ultrason");
        newData.ultrason = {
          distance_mm: sensors.ultrason.distance_mm,
          received_at: sensors.ultrason.received_at,
          layers: ultraDetect.layers,
          confidence: ultraDetect.confidence,
          flag: ultraDetect.flag,
          residual: ultraDetect.residual,
          raw_payload: sensors.ultrason.raw_payload,
        };
        console.log("[STATE] Ultrason updated:", JSON.stringify(newData.ultrason));
      } else {
        console.log("[STATE] No ultrason data in this poll cycle");
      }

      setSensorData(function (prev) {
        var merged = {
          laser: newData.laser || prev.laser,
          ultrason: newData.ultrason || prev.ultrason,
        };
        console.log(
          "[STATE] Merged state → laser:",
          merged.laser ? merged.laser.layers + " layers (" + merged.laser.distance_mm + "mm)" : "null",
          "| ultrason:",
          merged.ultrason ? merged.ultrason.layers + " layers (" + merged.ultrason.distance_mm + "mm)" : "null"
        );
        return merged;
      });
    });
  }, []);

  useEffect(function () {
    console.log("[POLL] Starting initial poll + interval (" + POLL_INTERVAL + "ms)");
    doPoll();
    var id = setInterval(doPoll, POLL_INTERVAL);
    console.log("[POLL] Interval ID:", id);
    return function () {
      console.log("[POLL] Clearing interval", id);
      clearInterval(id);
    };
  }, [doPoll]);

  var now = new Date();
  var dateStr = now.toLocaleDateString("fr-CH", { weekday: "long", day: "numeric", month: "long" });
  var timeStr = now.toLocaleTimeString("fr-CH", { hour: "2-digit", minute: "2-digit" });

  return (
    <React.Fragment>
      <TopBar />
      <main className="page">
        <StockView
          sensorData={sensorData}
          pollStatus={pollStatus}
          corsMode={corsMode}
          selected={selected}
          onSelect={setSelected}
        />
      </main>
      <ArmoireDrawer
        armoire={selected}
        onClose={() => setSelected(null)}
        sensorData={sensorData}
      />
    </React.Fragment>
  );
}

console.log("[APP] Mounting React app…");
ReactDOM.createRoot(document.getElementById("root")).render(<App />);
console.log("[APP] React app mounted.");
