// PATCH 응답 또는 (향후 도입 시) SSE 푸시로 들어온 doc을 로컬 cache의 doc과
// 합칠 때 사용. updated_at 비교로 stale 갱신을 무시 → optimistic update가
// 더 fresh한 데이터 위에 덮어쓰는 race를 차단. plan 5대 원칙 #6.
//
// 더 강력한 보호는 backend ETag/If-Match 도입이 필요(plan 부록 #8).
// 이 헬퍼는 그 사이의 가장 흔한 race(stale PATCH가 fresh push 위에 덮어쓰기)를 막는다.
//
// 사용 예:
//   documents = mergeDoc(documents, response);  // PATCH 응답
//   documents = dropDoc(documents, id);          // 삭제 / Inbox 승인 후 제거

export interface DocLike {
  id: number;
  updated_at: string;
}

export function mergeDoc<T extends DocLike>(list: T[], incoming: T): T[] {
  const idx = list.findIndex((d) => d.id === incoming.id);
  if (idx === -1) {
    // 새 doc — 맨 앞에 삽입
    return [incoming, ...list];
  }
  const current = list[idx];
  if (new Date(incoming.updated_at) < new Date(current.updated_at)) {
    // stale — 무시
    return list;
  }
  const next = [...list];
  next[idx] = incoming;
  return next;
}

export function dropDoc<T extends { id: number }>(list: T[], id: number): T[] {
  return list.filter((d) => d.id !== id);
}
