/**
 * Bounded FIFO set of outbound message IDs.
 *
 * Used by the WhatsApp bridge to distinguish "echo of our own /send" from
 * "owner-typed message on the linked device" when forwarding `fromMe`
 * inbound events back to the Python adapter.
 *
 * Eviction drops the oldest insertion-order entry when the cap is exceeded.
 * Re-remembering an existing id is a no-op for ordering (not LRU refresh).
 *
 * Heuristic limitation (intentional, documented for future debugging):
 * the set is in-memory only.  On bridge restart it is empty, so for the
 * brief window between restart and the first new outbound, any in-flight
 * delivery receipts of pre-restart sends would be classified as
 * owner-typed.  The TTL on owner-driven plugin actions (e.g. handover
 * sliding TTL) bounds blast radius; persisting would not be worth the
 * extra complexity / disk churn.
 */

export function createOutboundIdTracker(maxSize = 512) {
  if (!Number.isInteger(maxSize) || maxSize < 1) {
    throw new RangeError('createOutboundIdTracker: maxSize must be a positive integer');
  }
  const ids = new Set();

  function remember(id) {
    if (!id) return;
    ids.add(id);
    while (ids.size > maxSize) {
      // Set iteration order is insertion order, so values().next() is the
      // oldest entry — drop it to keep memory flat under sustained sending.
      ids.delete(ids.values().next().value);
    }
  }

  function has(id) {
    return Boolean(id) && ids.has(id);
  }

  function size() {
    return ids.size;
  }

  return { remember, has, size };
}
