import { getLatestDeviceConfigAck, toDeviceConfigAckPayload, toDeviceConfigPayload } from "../store/deviceConfigStore"; import { listMqttMessages, toMqttMessagePayload } from "../store/mqttMessageStore"; function deriveConfigDriftStatus(config, latestAck) { if (!latestAck) { return "pending_ack"; } if (latestAck.config_version < config.config_version) { return "stale_ack"; } if (latestAck.config_version > config.config_version) { return "pending_ack"; } if (latestAck.status === "failed") { return "failed_ack"; } return "applied"; } export async function buildDeviceConfigStatus(config) { const latestAck = await getLatestDeviceConfigAck(config.device_id); const latestPush = (await listMqttMessages({ device_id: config.device_id, direction: "downlink", message_type: "config_push", correlation_id: `config:${config.config_version}`, limit: 1 }))[0]; const driftStatus = latestPush ? deriveConfigDriftStatus(config, latestAck) : "never_pushed"; return { device_id: config.device_id, config: toDeviceConfigPayload(config), drift_status: driftStatus, desired_config_version: config.config_version, latest_ack: latestAck ? toDeviceConfigAckPayload(latestAck) : null, latest_push: latestPush ? toMqttMessagePayload(latestPush) : null, retry_recommended: driftStatus !== "applied" }; }