// Device data store: CRUD helpers

#include "device.hpp"

// Find a device by MAC address, returns nullptr if not found
internal device_t *find_device(const char *mac)
{
  for (int i = 0; i < MAX_DEVICES; i++)
  {
    if (g_Devices[i].active && strcmp(g_Devices[i].mac, mac) == 0)
    {
      return &g_Devices[i];
    }
  }
  return nullptr;
}

// Register a device by MAC. Returns pointer to device (existing or new).
// Sets *was_new to true if it was freshly registered.
internal device_t *register_device(const char *mac, bool *was_new)
{
  *was_new = false;

  // Check for existing
  device_t *existing = find_device(mac);
  if (existing)
  {
    return existing;
  }

  // Find a free slot
  for (int i = 0; i < MAX_DEVICES; i++)
  {
    if (!g_Devices[i].active)
    {
      strlcpy(g_Devices[i].mac, mac, sizeof(g_Devices[i].mac));
      g_Devices[i].active = true;
      strlcpy(g_Devices[i].xml_layout, kDefaultLayoutXml, sizeof(g_Devices[i].xml_layout));
      *was_new = true;
      return &g_Devices[i];
    }
  }

  return nullptr; // All slots full
}

// Update the XML layout for a device. Returns true on success.
internal bool update_device_layout(const char *mac, const char *xml)
{
  device_t *dev = find_device(mac);
  if (!dev)
  {
    return false;
  }
  strlcpy(dev->xml_layout, xml, sizeof(dev->xml_layout));
  return true;
}
