/**
 * BookingTicket - 预约状态相关纯函数。
 *
 * 该文件不持有任何运行时引用（无 request / store / effects），
 * 只做字段解析与本地数组的原地写入/回滚，便于独立单测与未来其他
 * booking 写操作（editBooking / cancelBooking 等）复用。
 *
 * 设计依据：参考 .cursor/rules/data-field-semantics.mdc，
 * 字段含义严格对齐既有协议（OrderTempOrder / parseSalesResponse），
 * 不发明等价关系。
 */

/**
 * 从 tempOrder 解析用于调用 appointment-status 接口的 schedule id。
 *
 * 优先级：
 *   1. `tempOrder.metadata.appointment_booking_parent_schedule_id`
 *   2. `tempOrder.bookings` 中 `parent_id === 0` 的 `schedule_event_id`
 *
 * 都缺失时返回 null，由调用方决定如何抛错。
 */
export function resolveScheduleId(tempOrder) {
  var _tempOrder$metadata;
  if (!tempOrder) return null;
  var metaScheduleId = (_tempOrder$metadata = tempOrder.metadata) === null || _tempOrder$metadata === void 0 ? void 0 : _tempOrder$metadata.appointment_booking_parent_schedule_id;
  if (metaScheduleId !== undefined && metaScheduleId !== null) {
    return metaScheduleId;
  }
  var bookings = Array.isArray(tempOrder.bookings) ? tempOrder.bookings : [];
  var rootBooking = bookings.find(function (b) {
    return (b === null || b === void 0 ? void 0 : b.parent_id) === 0;
  });
  var fallback = rootBooking === null || rootBooking === void 0 ? void 0 : rootBooking.schedule_event_id;
  return fallback !== undefined && fallback !== null ? fallback : null;
}

/**
 * 原地把所有 bookings 的 `appointment_status` 覆盖为新值，
 * 返回原 status 数组用于回滚（顺序与 bookings 一一对应）。
 *
 * - 元素为 null/undefined 时跳过写入（但占位仍保留以保证回滚下标对齐）
 * - 不会克隆 booking 对象，保持与 OrderModule.tempOrder 引用一致
 */
export function applyBookingsStatus(bookings, status) {
  if (!Array.isArray(bookings)) return [];
  var previous = bookings.map(function (b) {
    return b === null || b === void 0 ? void 0 : b.appointment_status;
  });
  bookings.forEach(function (b) {
    if (b) b.appointment_status = status;
  });
  return previous;
}

/**
 * 把 applyBookingsStatus 的返回值原地写回，撤销乐观更新。
 * 长度不一致时按较短一方对齐（防御式编程，正常路径不会发生）。
 */
export function restoreBookingsStatus(bookings, previous) {
  if (!Array.isArray(bookings)) return;
  var len = Math.min(bookings.length, previous.length);
  for (var i = 0; i < len; i += 1) {
    var b = bookings[i];
    if (b) b.appointment_status = previous[i];
  }
}