{"version":3,"file":"index.cjs","sources":["../src/utils/errors.js","../src/utils/validators.js","../src/utils/calculators.js","../src/models/Rink.js","../src/models/Green.js","../src/models/Booking.js","../src/models/BookingType.js","../src/models/AuditLogEntry.js","../src/models/TimeSlot.js","../src/models/BookingSystem.js"],"sourcesContent":["/**\r\n * Base error class for BookingJS\r\n */\r\nexport class BookingJSError extends Error {\r\n  constructor(message, code) {\r\n    super(message);\r\n    this.name = this.constructor.name;\r\n    this.code = code;\r\n    Error.captureStackTrace(this, this.constructor);\r\n  }\r\n}\r\n\r\n/**\r\n * Error thrown when a booking conflicts with an existing reservation\r\n */\r\nexport class BookingConflictError extends BookingJSError {\r\n  constructor(message = 'Booking conflicts with existing reservation', conflictingBooking = null) {\r\n    super(message, 'BOOKING_CONFLICT');\r\n    this.conflictingBooking = conflictingBooking;\r\n  }\r\n}\r\n\r\n/**\r\n * Error thrown when requested time slot is not available\r\n */\r\nexport class InvalidTimeSlotError extends BookingJSError {\r\n  constructor(message = 'Requested time slot is not available') {\r\n    super(message, 'INVALID_TIME_SLOT');\r\n  }\r\n}\r\n\r\n/**\r\n * Error thrown when member lacks required permissions\r\n */\r\nexport class MemberPermissionError extends BookingJSError {\r\n  constructor(message = 'Member lacks required permissions', memberId = null) {\r\n    super(message, 'MEMBER_PERMISSION');\r\n    this.memberId = memberId;\r\n  }\r\n}\r\n\r\n/**\r\n * Error thrown for data validation failures\r\n */\r\nexport class ValidationError extends BookingJSError {\r\n  constructor(message = 'Data validation failed', field = null, value = null) {\r\n    super(message, 'VALIDATION_ERROR');\r\n    this.field = field;\r\n    this.value = value;\r\n  }\r\n}\r\n\r\n/**\r\n * Error thrown when booking type is not allowed on green/rink\r\n */\r\nexport class BookingTypeNotAllowedError extends BookingJSError {\r\n  constructor(message = 'Booking type is not allowed on this green/rink', bookingTypeId = null, location = null) {\r\n    super(message, 'BOOKING_TYPE_NOT_ALLOWED');\r\n    this.bookingTypeId = bookingTypeId;\r\n    this.location = location;\r\n  }\r\n} ","import { ValidationError, InvalidTimeSlotError, MemberPermissionError } from './errors.js';\r\n\r\n/**\r\n * Validates booking data\r\n * @param {Object} bookingData - Booking data to validate\r\n * @throws {ValidationError} When validation fails\r\n */\r\nexport function validateBooking(bookingData) {\r\n  if (!bookingData) {\r\n    throw new ValidationError('Booking data is required');\r\n  }\r\n\r\n  if (!bookingData.memberId) {\r\n    throw new ValidationError('Member ID is required', 'memberId', bookingData.memberId);\r\n  }\r\n\r\n  if (!bookingData.rinkId) {\r\n    throw new ValidationError('Rink ID is required', 'rinkId', bookingData.rinkId);\r\n  }\r\n\r\n  if (!bookingData.bookingTypeId) {\r\n    throw new ValidationError('Booking type ID is required', 'bookingTypeId', bookingData.bookingTypeId);\r\n  }\r\n\r\n  if (!bookingData.date) {\r\n    throw new ValidationError('Date is required', 'date', bookingData.date);\r\n  }\r\n\r\n  if (!bookingData.start || !(bookingData.start instanceof Date)) {\r\n    throw new ValidationError('Valid start time is required', 'start', bookingData.start);\r\n  }\r\n\r\n  if (!bookingData.end || !(bookingData.end instanceof Date)) {\r\n    throw new ValidationError('Valid end time is required', 'end', bookingData.end);\r\n  }\r\n\r\n  if (bookingData.start >= bookingData.end) {\r\n    throw new ValidationError('End time must be after start time', 'time', {\r\n      start: bookingData.start,\r\n      end: bookingData.end\r\n    });\r\n  }\r\n\r\n  // Validate status if provided\r\n  const validStatuses = ['pending', 'confirmed', 'cancelled', 'completed'];\r\n  if (bookingData.status && !validStatuses.includes(bookingData.status)) {\r\n    throw new ValidationError('Invalid booking status', 'status', bookingData.status);\r\n  }\r\n}\r\n\r\n/**\r\n * Validates time slot data\r\n * @param {Object} timeSlot - Time slot to validate\r\n * @throws {InvalidTimeSlotError} When validation fails\r\n */\r\nexport function validateTimeSlot(timeSlot) {\r\n  if (!timeSlot) {\r\n    throw new InvalidTimeSlotError('Time slot is required');\r\n  }\r\n\r\n  if (!timeSlot.start || !(timeSlot.start instanceof Date)) {\r\n    throw new InvalidTimeSlotError('Valid start time is required');\r\n  }\r\n\r\n  if (!timeSlot.end || !(timeSlot.end instanceof Date)) {\r\n    throw new InvalidTimeSlotError('Valid end time is required');\r\n  }\r\n\r\n  if (timeSlot.start >= timeSlot.end) {\r\n    throw new InvalidTimeSlotError('End time must be after start time');\r\n  }\r\n}\r\n\r\n/**\r\n * Validates member permissions (placeholder for future implementation)\r\n * @param {string} memberId - Member ID to validate\r\n * @param {string} action - Action being performed\r\n * @throws {MemberPermissionError} When validation fails\r\n */\r\nexport function validateMember(memberId, action = 'access') {\r\n  if (!memberId || typeof memberId !== 'string') {\r\n    throw new MemberPermissionError('Valid member ID is required', memberId);\r\n  }\r\n\r\n  // Placeholder for future permission validation logic\r\n  // This would integrate with the container app's permission system\r\n}\r\n\r\n/**\r\n * Validates UUID format\r\n * @param {string} id - ID to validate\r\n * @param {string} fieldName - Name of the field being validated\r\n * @throws {ValidationError} When validation fails\r\n */\r\nexport function validateUUID(id, fieldName = 'id') {\r\n  const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\r\n  \r\n  if (!id || typeof id !== 'string' || !uuidRegex.test(id)) {\r\n    throw new ValidationError(`Valid UUID required for ${fieldName}`, fieldName, id);\r\n  }\r\n}\r\n\r\n/**\r\n * Validates color hex format\r\n * @param {string} color - Color hex string to validate\r\n * @param {string} fieldName - Name of the field being validated\r\n * @throws {ValidationError} When validation fails\r\n */\r\nexport function validateColor(color, fieldName = 'color') {\r\n  const colorRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;\r\n  \r\n  if (!color || typeof color !== 'string' || !colorRegex.test(color)) {\r\n    throw new ValidationError(`Valid hex color required for ${fieldName}`, fieldName, color);\r\n  }\r\n} ","/**\r\n * Calculate duration between two dates in minutes\r\n * @param {Date} start - Start time\r\n * @param {Date} end - End time\r\n * @returns {number} Duration in minutes\r\n */\r\nexport function calculateDuration(start, end) {\r\n  if (!start || !end || !(start instanceof Date) || !(end instanceof Date)) {\r\n    return 0;\r\n  }\r\n  return Math.round((end - start) / (1000 * 60));\r\n}\r\n\r\n/**\r\n * Check if a time slot is available (not overlapping with existing bookings)\r\n * @param {Date} start - Proposed start time\r\n * @param {Date} end - Proposed end time\r\n * @param {Array} existingBookings - Array of existing bookings to check against\r\n * @param {string} excludeBookingId - Booking ID to exclude from check (for updates)\r\n * @returns {boolean} True if time slot is available\r\n */\r\nexport function isTimeSlotAvailable(start, end, existingBookings = [], excludeBookingId = null) {\r\n  if (!start || !end || !(start instanceof Date) || !(end instanceof Date)) {\r\n    return false;\r\n  }\r\n\r\n  if (start >= end) {\r\n    return false;\r\n  }\r\n\r\n  for (const booking of existingBookings) {\r\n    // Skip cancelled bookings and excluded booking\r\n    if (booking.status === 'cancelled' || booking._id === excludeBookingId) {\r\n      continue;\r\n    }\r\n\r\n    const bookingStart = booking.start;\r\n    const bookingEnd = booking.end;\r\n\r\n    // Check for time overlap\r\n    if (start < bookingEnd && end > bookingStart) {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  return true;\r\n}\r\n\r\n/**\r\n * Format date and time for display\r\n * @param {Date} date - Date to format\r\n * @param {Object} options - Formatting options\r\n * @returns {string} Formatted date string\r\n */\r\nexport function formatDateTime(date, options = {}) {\r\n  if (!date || !(date instanceof Date)) {\r\n    return '';\r\n  }\r\n\r\n  const defaults = {\r\n    year: 'numeric',\r\n    month: '2-digit',\r\n    day: '2-digit',\r\n    hour: '2-digit',\r\n    minute: '2-digit',\r\n    hour12: false\r\n  };\r\n\r\n  const formatOptions = { ...defaults, ...options };\r\n  return date.toLocaleString('en-GB', formatOptions);\r\n}\r\n\r\n/**\r\n * Check if two time periods overlap\r\n * @param {Date} start1 - Start of first period\r\n * @param {Date} end1 - End of first period  \r\n * @param {Date} start2 - Start of second period\r\n * @param {Date} end2 - End of second period\r\n * @returns {boolean} True if periods overlap\r\n */\r\nexport function timePeriodsOverlap(start1, end1, start2, end2) {\r\n  return start1 < end2 && end1 > start2;\r\n}\r\n\r\n/**\r\n * Get the next available time slot after a given time\r\n * @param {Date} afterTime - Time to search after\r\n * @param {number} duration - Duration in minutes\r\n * @param {Array} existingBookings - Existing bookings to avoid\r\n * @param {Object} workingHours - Working hours constraints\r\n * @returns {Object|null} Next available slot or null\r\n */\r\nexport function getNextAvailableSlot(afterTime, duration, existingBookings = [], workingHours = null) {\r\n  if (!afterTime || !duration || duration <= 0) {\r\n    return null;\r\n  }\r\n\r\n  const proposedStart = new Date(afterTime);\r\n  const proposedEnd = new Date(proposedStart.getTime() + (duration * 60 * 1000));\r\n\r\n  // Apply working hours if provided\r\n  if (workingHours) {\r\n    const startHour = proposedStart.getHours();\r\n    const endHour = proposedEnd.getHours();\r\n    \r\n    if (startHour < workingHours.start || endHour > workingHours.end) {\r\n      // Adjust to next available working hour\r\n      const nextDay = new Date(proposedStart);\r\n      nextDay.setDate(nextDay.getDate() + 1);\r\n      nextDay.setHours(workingHours.start, 0, 0, 0);\r\n      return getNextAvailableSlot(nextDay, duration, existingBookings, workingHours);\r\n    }\r\n  }\r\n\r\n  if (isTimeSlotAvailable(proposedStart, proposedEnd, existingBookings)) {\r\n    return {\r\n      start: proposedStart,\r\n      end: proposedEnd\r\n    };\r\n  }\r\n\r\n  // Find next gap in bookings\r\n  const futureBookings = existingBookings\r\n    .filter(booking => booking.start > afterTime && booking.status !== 'cancelled')\r\n    .sort((a, b) => a.start - b.start);\r\n\r\n  if (futureBookings.length === 0) {\r\n    return {\r\n      start: proposedStart,\r\n      end: proposedEnd\r\n    };\r\n  }\r\n\r\n  // Try after each booking\r\n  for (const booking of futureBookings) {\r\n    const nextSlot = getNextAvailableSlot(booking.end, duration, existingBookings, workingHours);\r\n    if (nextSlot) {\r\n      return nextSlot;\r\n    }\r\n  }\r\n\r\n  return null;\r\n} ","import { v4 as uuidv4 } from 'uuid';\r\nimport { ValidationError, BookingTypeNotAllowedError } from '../utils/errors.js';\r\nimport { isTimeSlotAvailable } from '../utils/calculators.js';\r\n\r\n/**\r\n * Represents a bookable rink within a green\r\n */\r\nexport class Rink {\r\n  /**\r\n   * Create a new Rink\r\n   * @param {Object} data - Rink configuration\r\n   * @param {string} [data._id] - Unique identifier (auto-generated if not provided)\r\n   * @param {number} data.number - Rink number (1-12)\r\n   * @param {Array<string>} [data.allowedBookingTypes] - Array of BookingType IDs that can be booked\r\n   */\r\n  constructor(data) {\r\n    if (!data || typeof data !== 'object') {\r\n      throw new ValidationError('Rink data is required');\r\n    }\r\n\r\n    if (typeof data.number !== 'number' || data.number < 1 || data.number > 12) {\r\n      throw new ValidationError('Rink number must be between 1 and 12', 'number', data.number);\r\n    }\r\n\r\n    this._id = data._id || uuidv4();\r\n    this.number = data.number;\r\n    this.allowedBookingTypes = Array.isArray(data.allowedBookingTypes) \r\n      ? [...data.allowedBookingTypes] \r\n      : [];\r\n  }\r\n\r\n  /**\r\n   * Update rink details\r\n   * @param {Object} updates - Properties to update\r\n   * @returns {Rink} This instance for chaining\r\n   */\r\n  update(updates) {\r\n    if (!updates || typeof updates !== 'object') {\r\n      throw new ValidationError('Updates object is required');\r\n    }\r\n\r\n    const allowedFields = ['number', 'allowedBookingTypes'];\r\n    const updateKeys = Object.keys(updates);\r\n\r\n    for (const key of updateKeys) {\r\n      if (!allowedFields.includes(key)) {\r\n        throw new ValidationError(`Field '${key}' cannot be updated`, key, updates[key]);\r\n      }\r\n    }\r\n\r\n    // Validate number update\r\n    if (updates.number !== undefined) {\r\n      if (typeof updates.number !== 'number' || updates.number < 1 || updates.number > 12) {\r\n        throw new ValidationError('Rink number must be between 1 and 12', 'number', updates.number);\r\n      }\r\n      this.number = updates.number;\r\n    }\r\n\r\n    // Validate allowedBookingTypes update\r\n    if (updates.allowedBookingTypes !== undefined) {\r\n      if (!Array.isArray(updates.allowedBookingTypes)) {\r\n        throw new ValidationError('Allowed booking types must be an array', 'allowedBookingTypes', updates.allowedBookingTypes);\r\n      }\r\n      this.allowedBookingTypes = [...updates.allowedBookingTypes];\r\n    }\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Check availability for specific time\r\n   * @param {Date} date - Date to check\r\n   * @param {Date} start - Start time to check\r\n   * @param {Date} end - End time to check\r\n   * @param {Array} existingBookings - Existing bookings to check against\r\n   * @param {string} excludeBookingId - Booking ID to exclude from check\r\n   * @returns {boolean} True if available\r\n   */\r\n  isAvailable(date, start, end, existingBookings = [], excludeBookingId = null) {\r\n    if (!date || !start || !end) {\r\n      return false;\r\n    }\r\n\r\n    // Filter bookings for this rink and date\r\n    const rinkBookings = existingBookings.filter(booking => \r\n      booking.rinkId === this._id &&\r\n      booking.date.toDateString() === date.toDateString() &&\r\n      booking.status !== 'cancelled'\r\n    );\r\n\r\n    return isTimeSlotAvailable(start, end, rinkBookings, excludeBookingId);\r\n  }\r\n\r\n  /**\r\n   * Add a booking type to allowed types\r\n   * @param {string} bookingTypeId - Booking type ID to add\r\n   * @returns {Rink} This instance for chaining\r\n   */\r\n  addAllowedBookingType(bookingTypeId) {\r\n    if (!bookingTypeId || typeof bookingTypeId !== 'string') {\r\n      throw new ValidationError('Valid booking type ID is required', 'bookingTypeId', bookingTypeId);\r\n    }\r\n\r\n    if (!this.allowedBookingTypes.includes(bookingTypeId)) {\r\n      this.allowedBookingTypes.push(bookingTypeId);\r\n    }\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Remove a booking type from allowed types\r\n   * @param {string} bookingTypeId - Booking type ID to remove\r\n   * @returns {Rink} This instance for chaining\r\n   */\r\n  removeAllowedBookingType(bookingTypeId) {\r\n    if (!bookingTypeId || typeof bookingTypeId !== 'string') {\r\n      throw new ValidationError('Valid booking type ID is required', 'bookingTypeId', bookingTypeId);\r\n    }\r\n\r\n    const index = this.allowedBookingTypes.indexOf(bookingTypeId);\r\n    if (index > -1) {\r\n      this.allowedBookingTypes.splice(index, 1);\r\n    }\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Check if booking type is allowed on this rink\r\n   * @param {string} bookingTypeId - Booking type ID to check\r\n   * @returns {boolean} True if booking type is allowed\r\n   */\r\n  isBookingTypeAllowed(bookingTypeId) {\r\n    if (!bookingTypeId || typeof bookingTypeId !== 'string') {\r\n      return false;\r\n    }\r\n\r\n    // If no restrictions, allow all booking types\r\n    if (this.allowedBookingTypes.length === 0) {\r\n      return true;\r\n    }\r\n\r\n    return this.allowedBookingTypes.includes(bookingTypeId);\r\n  }\r\n\r\n  /**\r\n   * Validate if a booking can be made on this rink\r\n   * @param {string} bookingTypeId - Booking type ID\r\n   * @param {Date} date - Booking date\r\n   * @param {Date} start - Start time\r\n   * @param {Date} end - End time\r\n   * @param {Array} existingBookings - Existing bookings\r\n   * @param {string} excludeBookingId - Booking ID to exclude\r\n   * @throws {BookingTypeNotAllowedError} When booking type is not allowed\r\n   * @throws {ValidationError} When time slot is not available\r\n   */\r\n  validateBooking(bookingTypeId, date, start, end, existingBookings = [], excludeBookingId = null) {\r\n    // Check if booking type is allowed\r\n    if (!this.isBookingTypeAllowed(bookingTypeId)) {\r\n      throw new BookingTypeNotAllowedError(\r\n        `Booking type ${bookingTypeId} is not allowed on rink ${this.number}`,\r\n        bookingTypeId,\r\n        `rink-${this._id}`\r\n      );\r\n    }\r\n\r\n    // Check availability\r\n    if (!this.isAvailable(date, start, end, existingBookings, excludeBookingId)) {\r\n      throw new ValidationError(\r\n        `Rink ${this.number} is not available for the requested time slot`,\r\n        'availability',\r\n        { date, start, end }\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get bookings for this rink within a date range\r\n   * @param {Array} allBookings - All bookings to filter\r\n   * @param {Date} startDate - Start of date range\r\n   * @param {Date} endDate - End of date range\r\n   * @returns {Array} Filtered bookings for this rink\r\n   */\r\n  getBookings(allBookings, startDate = null, endDate = null) {\r\n    let rinkBookings = allBookings.filter(booking => booking.rinkId === this._id);\r\n\r\n    if (startDate && endDate) {\r\n      rinkBookings = rinkBookings.filter(booking => {\r\n        const bookingDate = new Date(booking.date);\r\n        return bookingDate >= startDate && bookingDate <= endDate;\r\n      });\r\n    }\r\n\r\n    return rinkBookings.sort((a, b) => a.start - b.start);\r\n  }\r\n\r\n  /**\r\n   * Get utilization statistics for this rink\r\n   * @param {Array} allBookings - All bookings to analyze\r\n   * @param {Date} startDate - Start of analysis period\r\n   * @param {Date} endDate - End of analysis period\r\n   * @returns {Object} Utilization statistics\r\n   */\r\n  getUtilizationStats(allBookings, startDate, endDate) {\r\n    const rinkBookings = this.getBookings(allBookings, startDate, endDate)\r\n      .filter(booking => booking.status === 'confirmed' || booking.status === 'completed');\r\n\r\n    const totalMinutes = rinkBookings.reduce((sum, booking) => {\r\n      return sum + Math.round((booking.end - booking.start) / (1000 * 60));\r\n    }, 0);\r\n\r\n    const totalDays = Math.ceil((endDate - startDate) / (1000 * 60 * 60 * 24));\r\n    const totalAvailableMinutes = totalDays * 12 * 60; // Assuming 12 hours per day\r\n\r\n    return {\r\n      rinkId: this._id,\r\n      rinkNumber: this.number,\r\n      totalBookings: rinkBookings.length,\r\n      totalBookedMinutes: totalMinutes,\r\n      totalAvailableMinutes,\r\n      utilizationPercentage: (totalMinutes / totalAvailableMinutes) * 100,\r\n      averageBookingDuration: rinkBookings.length > 0 ? totalMinutes / rinkBookings.length : 0\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Convert to JSON string for persistence\r\n   * @returns {string} JSON string representation\r\n   */\r\n  toJSON() {\r\n    const data = {\r\n      _id: this._id,\r\n      number: this.number,\r\n      allowedBookingTypes: [...this.allowedBookingTypes]\r\n    };\r\n    return JSON.stringify(data);\r\n  }\r\n\r\n  /**\r\n   * Create Rink instance from JSON string\r\n   * @param {string} jsonString - JSON string data\r\n   * @returns {Rink} New Rink instance\r\n   */\r\n  static fromJSON(jsonString) {\r\n    if (!jsonString || typeof jsonString !== 'string') {\r\n      throw new ValidationError('Valid JSON string is required');\r\n    }\r\n\r\n    let jsonData;\r\n    try {\r\n      jsonData = JSON.parse(jsonString);\r\n    } catch (error) {\r\n      throw new ValidationError('Invalid JSON string format');\r\n    }\r\n\r\n    return new Rink({\r\n      _id: jsonData._id,\r\n      number: jsonData.number,\r\n      allowedBookingTypes: jsonData.allowedBookingTypes || []\r\n    });\r\n  }\r\n} ","import { v4 as uuidv4 } from 'uuid';\r\nimport { ValidationError, BookingTypeNotAllowedError } from '../utils/errors.js';\r\nimport { Rink } from './Rink.js';\r\n\r\n/**\r\n * Represents a bowling green containing multiple rinks\r\n */\r\nexport class Green {\r\n  /**\r\n   * Create a new Green\r\n   * @param {Object} data - Green configuration\r\n   * @param {string} [data._id] - Unique identifier (auto-generated if not provided)\r\n   * @param {string} data.name - Name of the green\r\n   * @param {Array<Rink>} [data.rinks] - Array of Rink instances (max 12)\r\n   * @param {string} [data.location] - Physical location/address\r\n   * @param {Array<string>} [data.facilities] - Array of available facilities\r\n   * @param {Array<string>} [data.allowedBookingTypes] - Array of BookingType IDs\r\n   */\r\n  constructor(data) {\r\n    if (!data || typeof data !== 'object') {\r\n      throw new ValidationError('Green data is required');\r\n    }\r\n\r\n    if (!data.name || typeof data.name !== 'string') {\r\n      throw new ValidationError('Name is required', 'name', data.name);\r\n    }\r\n\r\n    this._id = data._id || uuidv4();\r\n    this.name = data.name.trim();\r\n    this.location = data.location ? data.location.trim() : '';\r\n    this.facilities = Array.isArray(data.facilities) ? [...data.facilities] : [];\r\n    this.allowedBookingTypes = Array.isArray(data.allowedBookingTypes) \r\n      ? [...data.allowedBookingTypes] \r\n      : [];\r\n\r\n    // Initialize rinks\r\n    this.rinks = [];\r\n    if (Array.isArray(data.rinks)) {\r\n      for (const rinkData of data.rinks) {\r\n        if (rinkData instanceof Rink) {\r\n          this.addRink(rinkData);\r\n        } else {\r\n          this.addRink(new Rink(rinkData));\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add a rink to the green (max 12)\r\n   * @param {Rink|Object} rink - Rink instance or rink data\r\n   * @returns {Green} This instance for chaining\r\n   */\r\n  addRink(rink) {\r\n    if (this.rinks.length >= 12) {\r\n      throw new ValidationError('Maximum of 12 rinks allowed per green', 'rinks', this.rinks.length);\r\n    }\r\n\r\n    let rinkInstance;\r\n    if (rink instanceof Rink) {\r\n      rinkInstance = rink;\r\n    } else if (rink && typeof rink === 'object') {\r\n      rinkInstance = new Rink(rink);\r\n    } else {\r\n      throw new ValidationError('Valid rink data or Rink instance is required', 'rink', rink);\r\n    }\r\n\r\n    // Check for duplicate rink numbers\r\n    const existingRink = this.rinks.find(r => r.number === rinkInstance.number);\r\n    if (existingRink) {\r\n      throw new ValidationError(\r\n        `Rink number ${rinkInstance.number} already exists`,\r\n        'rinkNumber',\r\n        rinkInstance.number\r\n      );\r\n    }\r\n\r\n    this.rinks.push(rinkInstance);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Remove a rink from the green\r\n   * @param {string} rinkId - Rink ID to remove\r\n   * @returns {Green} This instance for chaining\r\n   */\r\n  removeRink(rinkId) {\r\n    if (!rinkId || typeof rinkId !== 'string') {\r\n      throw new ValidationError('Valid rink ID is required', 'rinkId', rinkId);\r\n    }\r\n\r\n    const index = this.rinks.findIndex(rink => rink._id === rinkId);\r\n    if (index === -1) {\r\n      throw new ValidationError('Rink not found', 'rinkId', rinkId);\r\n    }\r\n\r\n    this.rinks.splice(index, 1);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Get a specific rink by ID\r\n   * @param {string} rinkId - Rink ID to find\r\n   * @returns {Rink|null} Rink instance or null if not found\r\n   */\r\n  getRink(rinkId) {\r\n    if (!rinkId || typeof rinkId !== 'string') {\r\n      return null;\r\n    }\r\n\r\n    return this.rinks.find(rink => rink._id === rinkId) || null;\r\n  }\r\n\r\n  /**\r\n   * Get a rink by number\r\n   * @param {number} rinkNumber - Rink number to find\r\n   * @returns {Rink|null} Rink instance or null if not found\r\n   */\r\n  getRinkByNumber(rinkNumber) {\r\n    if (typeof rinkNumber !== 'number') {\r\n      return null;\r\n    }\r\n\r\n    return this.rinks.find(rink => rink.number === rinkNumber) || null;\r\n  }\r\n\r\n  /**\r\n   * Get available rinks for time period\r\n   * @param {Date} date - Date to check\r\n   * @param {Date} start - Start time\r\n   * @param {Date} end - End time\r\n   * @param {Array} existingBookings - Existing bookings to check against\r\n   * @param {string} bookingTypeId - Booking type ID to check restrictions\r\n   * @param {string} excludeBookingId - Booking ID to exclude from check\r\n   * @returns {Array<Rink>} Available rinks\r\n   */\r\n  getAvailableRinks(date, start, end, existingBookings = [], bookingTypeId = null, excludeBookingId = null) {\r\n    if (!date || !start || !end) {\r\n      return [];\r\n    }\r\n\r\n    return this.rinks.filter(rink => {\r\n      // Check booking type restrictions\r\n      if (bookingTypeId && !this.isBookingTypeAllowed(bookingTypeId)) {\r\n        return false;\r\n      }\r\n      \r\n      if (bookingTypeId && !rink.isBookingTypeAllowed(bookingTypeId)) {\r\n        return false;\r\n      }\r\n\r\n      // Check availability\r\n      return rink.isAvailable(date, start, end, existingBookings, excludeBookingId);\r\n    }).sort((a, b) => a.number - b.number);\r\n  }\r\n\r\n  /**\r\n   * Add a booking type to allowed types\r\n   * @param {string} bookingTypeId - Booking type ID to add\r\n   * @returns {Green} This instance for chaining\r\n   */\r\n  addAllowedBookingType(bookingTypeId) {\r\n    if (!bookingTypeId || typeof bookingTypeId !== 'string') {\r\n      throw new ValidationError('Valid booking type ID is required', 'bookingTypeId', bookingTypeId);\r\n    }\r\n\r\n    if (!this.allowedBookingTypes.includes(bookingTypeId)) {\r\n      this.allowedBookingTypes.push(bookingTypeId);\r\n    }\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Remove a booking type from allowed types\r\n   * @param {string} bookingTypeId - Booking type ID to remove\r\n   * @returns {Green} This instance for chaining\r\n   */\r\n  removeAllowedBookingType(bookingTypeId) {\r\n    if (!bookingTypeId || typeof bookingTypeId !== 'string') {\r\n      throw new ValidationError('Valid booking type ID is required', 'bookingTypeId', bookingTypeId);\r\n    }\r\n\r\n    const index = this.allowedBookingTypes.indexOf(bookingTypeId);\r\n    if (index > -1) {\r\n      this.allowedBookingTypes.splice(index, 1);\r\n    }\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Check if booking type is allowed on this green\r\n   * @param {string} bookingTypeId - Booking type ID to check\r\n   * @returns {boolean} True if booking type is allowed\r\n   */\r\n  isBookingTypeAllowed(bookingTypeId) {\r\n    if (!bookingTypeId || typeof bookingTypeId !== 'string') {\r\n      return false;\r\n    }\r\n\r\n    // If no restrictions, allow all booking types\r\n    if (this.allowedBookingTypes.length === 0) {\r\n      return true;\r\n    }\r\n\r\n    return this.allowedBookingTypes.includes(bookingTypeId);\r\n  }\r\n\r\n  /**\r\n   * Add a facility to the green\r\n   * @param {string} facility - Facility name to add\r\n   * @returns {Green} This instance for chaining\r\n   */\r\n  addFacility(facility) {\r\n    if (!facility || typeof facility !== 'string') {\r\n      throw new ValidationError('Valid facility name is required', 'facility', facility);\r\n    }\r\n\r\n    const facilityName = facility.trim();\r\n    if (!this.facilities.includes(facilityName)) {\r\n      this.facilities.push(facilityName);\r\n    }\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Remove a facility from the green\r\n   * @param {string} facility - Facility name to remove\r\n   * @returns {Green} This instance for chaining\r\n   */\r\n  removeFacility(facility) {\r\n    if (!facility || typeof facility !== 'string') {\r\n      throw new ValidationError('Valid facility name is required', 'facility', facility);\r\n    }\r\n\r\n    const index = this.facilities.indexOf(facility.trim());\r\n    if (index > -1) {\r\n      this.facilities.splice(index, 1);\r\n    }\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Update green details\r\n   * @param {Object} updates - Properties to update\r\n   * @returns {Green} This instance for chaining\r\n   */\r\n  update(updates) {\r\n    if (!updates || typeof updates !== 'object') {\r\n      throw new ValidationError('Updates object is required');\r\n    }\r\n\r\n    const allowedFields = ['name', 'location', 'facilities', 'allowedBookingTypes'];\r\n    const updateKeys = Object.keys(updates);\r\n\r\n    for (const key of updateKeys) {\r\n      if (!allowedFields.includes(key)) {\r\n        throw new ValidationError(`Field '${key}' cannot be updated`, key, updates[key]);\r\n      }\r\n    }\r\n\r\n    // Apply updates\r\n    if (updates.name !== undefined) {\r\n      if (!updates.name || typeof updates.name !== 'string') {\r\n        throw new ValidationError('Name must be a non-empty string', 'name', updates.name);\r\n      }\r\n      this.name = updates.name.trim();\r\n    }\r\n\r\n    if (updates.location !== undefined) {\r\n      this.location = updates.location ? updates.location.trim() : '';\r\n    }\r\n\r\n    if (updates.facilities !== undefined) {\r\n      if (!Array.isArray(updates.facilities)) {\r\n        throw new ValidationError('Facilities must be an array', 'facilities', updates.facilities);\r\n      }\r\n      this.facilities = [...updates.facilities];\r\n    }\r\n\r\n    if (updates.allowedBookingTypes !== undefined) {\r\n      if (!Array.isArray(updates.allowedBookingTypes)) {\r\n        throw new ValidationError('Allowed booking types must be an array', 'allowedBookingTypes', updates.allowedBookingTypes);\r\n      }\r\n      this.allowedBookingTypes = [...updates.allowedBookingTypes];\r\n    }\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Get bookings for this green within a date range\r\n   * @param {Array} allBookings - All bookings to filter\r\n   * @param {Date} startDate - Start of date range\r\n   * @param {Date} endDate - End of date range\r\n   * @returns {Array} Filtered bookings for this green\r\n   */\r\n  getBookings(allBookings, startDate = null, endDate = null) {\r\n    const rinkIds = this.rinks.map(rink => rink._id);\r\n    let greenBookings = allBookings.filter(booking => rinkIds.includes(booking.rinkId));\r\n\r\n    if (startDate && endDate) {\r\n      greenBookings = greenBookings.filter(booking => {\r\n        const bookingDate = new Date(booking.date);\r\n        return bookingDate >= startDate && bookingDate <= endDate;\r\n      });\r\n    }\r\n\r\n    return greenBookings.sort((a, b) => a.start - b.start);\r\n  }\r\n\r\n  /**\r\n   * Get utilization statistics for this green\r\n   * @param {Array} allBookings - All bookings to analyze\r\n   * @param {Date} startDate - Start of analysis period\r\n   * @param {Date} endDate - End of analysis period\r\n   * @returns {Object} Utilization statistics\r\n   */\r\n  getUtilizationStats(allBookings, startDate, endDate) {\r\n    const greenBookings = this.getBookings(allBookings, startDate, endDate)\r\n      .filter(booking => booking.status === 'confirmed' || booking.status === 'completed');\r\n\r\n    const totalMinutes = greenBookings.reduce((sum, booking) => {\r\n      return sum + Math.round((booking.end - booking.start) / (1000 * 60));\r\n    }, 0);\r\n\r\n    const totalDays = Math.ceil((endDate - startDate) / (1000 * 60 * 60 * 24));\r\n    const totalAvailableMinutes = totalDays * this.rinks.length * 12 * 60; // Assuming 12 hours per day per rink\r\n\r\n    const rinkStats = this.rinks.map(rink => \r\n      rink.getUtilizationStats(allBookings, startDate, endDate)\r\n    );\r\n\r\n    return {\r\n      greenId: this._id,\r\n      greenName: this.name,\r\n      totalRinks: this.rinks.length,\r\n      totalBookings: greenBookings.length,\r\n      totalBookedMinutes: totalMinutes,\r\n      totalAvailableMinutes,\r\n      utilizationPercentage: (totalMinutes / totalAvailableMinutes) * 100,\r\n      averageBookingDuration: greenBookings.length > 0 ? totalMinutes / greenBookings.length : 0,\r\n      rinkStats\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Validate if a booking can be made on this green\r\n   * @param {string} rinkId - Rink ID\r\n   * @param {string} bookingTypeId - Booking type ID\r\n   * @param {Date} date - Booking date\r\n   * @param {Date} start - Start time\r\n   * @param {Date} end - End time\r\n   * @param {Array} existingBookings - Existing bookings\r\n   * @param {string} excludeBookingId - Booking ID to exclude\r\n   * @throws {ValidationError} When rink is not found\r\n   * @throws {BookingTypeNotAllowedError} When booking type is not allowed\r\n   */\r\n  validateBooking(rinkId, bookingTypeId, date, start, end, existingBookings = [], excludeBookingId = null) {\r\n    // Check if rink exists\r\n    const rink = this.getRink(rinkId);\r\n    if (!rink) {\r\n      throw new ValidationError(`Rink ${rinkId} not found in green ${this.name}`, 'rinkId', rinkId);\r\n    }\r\n\r\n    // Check if booking type is allowed on green\r\n    if (!this.isBookingTypeAllowed(bookingTypeId)) {\r\n      throw new BookingTypeNotAllowedError(\r\n        `Booking type ${bookingTypeId} is not allowed on green ${this.name}`,\r\n        bookingTypeId,\r\n        `green-${this._id}`\r\n      );\r\n    }\r\n\r\n    // Delegate to rink validation\r\n    rink.validateBooking(bookingTypeId, date, start, end, existingBookings, excludeBookingId);\r\n  }\r\n\r\n  /**\r\n   * Convert to JSON string for persistence\r\n   * @returns {string} JSON string representation\r\n   */\r\n  toJSON() {\r\n    const data = {\r\n      _id: this._id,\r\n      name: this.name,\r\n      location: this.location,\r\n      facilities: [...this.facilities],\r\n      allowedBookingTypes: [...this.allowedBookingTypes],\r\n      rinks: this.rinks.map(rink => JSON.parse(rink.toJSON()))\r\n    };\r\n    return JSON.stringify(data);\r\n  }\r\n\r\n  /**\r\n   * Create Green instance from JSON string\r\n   * @param {string} jsonString - JSON string data\r\n   * @returns {Green} New Green instance\r\n   */\r\n  static fromJSON(jsonString) {\r\n    if (!jsonString || typeof jsonString !== 'string') {\r\n      throw new ValidationError('Valid JSON string is required');\r\n    }\r\n\r\n    let jsonData;\r\n    try {\r\n      jsonData = JSON.parse(jsonString);\r\n    } catch (error) {\r\n      throw new ValidationError('Invalid JSON string format');\r\n    }\r\n\r\n    return new Green({\r\n      _id: jsonData._id,\r\n      name: jsonData.name,\r\n      location: jsonData.location,\r\n      facilities: jsonData.facilities || [],\r\n      allowedBookingTypes: jsonData.allowedBookingTypes || [],\r\n      rinks: jsonData.rinks || []\r\n    });\r\n  }\r\n} ","import { v4 as uuidv4 } from 'uuid';\r\nimport { ValidationError } from '../utils/errors.js';\r\nimport { validateBooking } from '../utils/validators.js';\r\nimport { calculateDuration } from '../utils/calculators.js';\r\n\r\n/**\r\n * Represents a booking reservation\r\n */\r\nexport class Booking {\r\n  /**\r\n   * Create a new Booking\r\n   * @param {Object} data - Booking configuration\r\n   * @param {string} [data._id] - Unique identifier (auto-generated if not provided)\r\n   * @param {string} data.memberId - Member GUID making the booking\r\n   * @param {string} data.rinkId - Reference to the booked rink\r\n   * @param {string} data.bookingTypeId - Reference to the booking type\r\n   * @param {Date} data.date - Booking date\r\n   * @param {Date} data.start - Booking start time\r\n   * @param {Date} data.end - Booking end time\r\n   * @param {string} [data.status='pending'] - Booking status\r\n   * @param {Array<string>} [data.participants] - Array of member IDs\r\n   * @param {string} [data.notes] - Additional booking notes\r\n   * @param {Date} [data.createdDate] - Timestamp of booking creation\r\n   * @param {Date} [data.updatedDate] - Timestamp of last update\r\n   */\r\n  constructor(data) {\r\n    if (!data || typeof data !== 'object') {\r\n      throw new ValidationError('Booking data is required');\r\n    }\r\n\r\n    // Validate required booking data\r\n    validateBooking(data);\r\n\r\n    this._id = data._id || uuidv4();\r\n    this.memberId = data.memberId;\r\n    this.rinkId = data.rinkId;\r\n    this.bookingTypeId = data.bookingTypeId;\r\n    this.date = new Date(data.date);\r\n    this.start = new Date(data.start);\r\n    this.end = new Date(data.end);\r\n    this.status = data.status || 'pending';\r\n    this.participants = Array.isArray(data.participants) ? [...data.participants] : [];\r\n    this.notes = data.notes || '';\r\n    this.createdDate = data.createdDate ? new Date(data.createdDate) : new Date();\r\n    this.updatedDate = data.updatedDate ? new Date(data.updatedDate) : new Date();\r\n\r\n    // Ensure member is in participants list\r\n    if (!this.participants.includes(this.memberId)) {\r\n      this.participants.unshift(this.memberId);\r\n    }\r\n\r\n    // Validate date consistency\r\n    const bookingDay = this.date.toDateString();\r\n    const startDay = this.start.toDateString();\r\n    const endDay = this.end.toDateString();\r\n\r\n    if (bookingDay !== startDay || bookingDay !== endDay) {\r\n      throw new ValidationError(\r\n        'Start and end times must be on the same date as the booking date',\r\n        'dateConsistency',\r\n        { date: this.date, start: this.start, end: this.end }\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update booking status\r\n   * @param {string} newStatus - New status to set\r\n   * @param {string} memberId - Member performing the update\r\n   * @returns {Booking} This instance for chaining\r\n   */\r\n  updateStatus(newStatus, memberId = null) {\r\n    const validStatuses = ['pending', 'confirmed', 'cancelled', 'completed'];\r\n    \r\n    if (!validStatuses.includes(newStatus)) {\r\n      throw new ValidationError('Invalid booking status', 'status', newStatus);\r\n    }\r\n\r\n    // Validate status transitions\r\n    const validTransitions = {\r\n      pending: ['confirmed', 'cancelled'],\r\n      confirmed: ['cancelled', 'completed'],\r\n      cancelled: [], // Cannot transition from cancelled\r\n      completed: [] // Cannot transition from completed\r\n    };\r\n\r\n    if (!validTransitions[this.status].includes(newStatus)) {\r\n      throw new ValidationError(\r\n        `Invalid status transition from ${this.status} to ${newStatus}`,\r\n        'statusTransition',\r\n        { from: this.status, to: newStatus }\r\n      );\r\n    }\r\n\r\n    this.status = newStatus;\r\n    this.updatedDate = new Date();\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Add participant to booking\r\n   * @param {string} memberId - Member ID to add\r\n   * @returns {Booking} This instance for chaining\r\n   */\r\n  addParticipant(memberId) {\r\n    if (!memberId || typeof memberId !== 'string') {\r\n      throw new ValidationError('Valid member ID is required', 'memberId', memberId);\r\n    }\r\n\r\n    if (!this.participants.includes(memberId)) {\r\n      this.participants.push(memberId);\r\n      this.updatedDate = new Date();\r\n    }\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Remove participant from booking\r\n   * @param {string} memberId - Member ID to remove\r\n   * @returns {Booking} This instance for chaining\r\n   */\r\n  removeParticipant(memberId) {\r\n    if (!memberId || typeof memberId !== 'string') {\r\n      throw new ValidationError('Valid member ID is required', 'memberId', memberId);\r\n    }\r\n\r\n    // Cannot remove the booking owner\r\n    if (memberId === this.memberId) {\r\n      throw new ValidationError('Cannot remove booking owner from participants', 'memberId', memberId);\r\n    }\r\n\r\n    const index = this.participants.indexOf(memberId);\r\n    if (index > -1) {\r\n      this.participants.splice(index, 1);\r\n      this.updatedDate = new Date();\r\n    }\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Get booking duration in minutes\r\n   * @returns {number} Duration in minutes\r\n   */\r\n  getDuration() {\r\n    return calculateDuration(this.start, this.end);\r\n  }\r\n\r\n  /**\r\n   * Check if booking is currently active\r\n   * @returns {boolean} True if booking is currently active\r\n   */\r\n  isActive() {\r\n    if (this.status !== 'confirmed') {\r\n      return false;\r\n    }\r\n\r\n    const now = new Date();\r\n    return now >= this.start && now <= this.end;\r\n  }\r\n\r\n  /**\r\n   * Check if booking is in the past\r\n   * @returns {boolean} True if booking is in the past\r\n   */\r\n  isPast() {\r\n    const now = new Date();\r\n    return this.end < now;\r\n  }\r\n\r\n  /**\r\n   * Check if booking is in the future\r\n   * @returns {boolean} True if booking is in the future\r\n   */\r\n  isFuture() {\r\n    const now = new Date();\r\n    return this.start > now;\r\n  }\r\n\r\n  /**\r\n   * Check if booking can be modified\r\n   * @returns {boolean} True if booking can be modified\r\n   */\r\n  canModify() {\r\n    return this.status === 'pending' || this.status === 'confirmed';\r\n  }\r\n\r\n  /**\r\n   * Check if booking can be cancelled\r\n   * @returns {boolean} True if booking can be cancelled\r\n   */\r\n  canCancel() {\r\n    return (this.status === 'pending' || this.status === 'confirmed') && !this.isPast();\r\n  }\r\n\r\n  /**\r\n   * Update booking details\r\n   * @param {Object} updates - Properties to update\r\n   * @param {string} memberId - Member performing the update\r\n   * @returns {Booking} This instance for chaining\r\n   */\r\n  update(updates, memberId = null) {\r\n    if (!updates || typeof updates !== 'object') {\r\n      throw new ValidationError('Updates object is required');\r\n    }\r\n\r\n    if (!this.canModify()) {\r\n      throw new ValidationError(`Cannot modify booking with status: ${this.status}`, 'status', this.status);\r\n    }\r\n\r\n    const allowedFields = ['date', 'start', 'end', 'bookingTypeId', 'participants', 'notes'];\r\n    const updateKeys = Object.keys(updates);\r\n\r\n    for (const key of updateKeys) {\r\n      if (!allowedFields.includes(key)) {\r\n        throw new ValidationError(`Field '${key}' cannot be updated`, key, updates[key]);\r\n      }\r\n    }\r\n\r\n    // Validate time updates\r\n    const newDate = updates.date ? new Date(updates.date) : this.date;\r\n    const newStart = updates.start ? new Date(updates.start) : this.start;\r\n    const newEnd = updates.end ? new Date(updates.end) : this.end;\r\n\r\n    if (newStart >= newEnd) {\r\n      throw new ValidationError('End time must be after start time', 'time', {\r\n        start: newStart,\r\n        end: newEnd\r\n      });\r\n    }\r\n\r\n    // Apply updates\r\n    if (updates.date !== undefined) {\r\n      this.date = newDate;\r\n    }\r\n    if (updates.start !== undefined) {\r\n      this.start = newStart;\r\n    }\r\n    if (updates.end !== undefined) {\r\n      this.end = newEnd;\r\n    }\r\n    if (updates.bookingTypeId !== undefined) {\r\n      this.bookingTypeId = updates.bookingTypeId;\r\n    }\r\n    if (updates.participants !== undefined) {\r\n      if (!Array.isArray(updates.participants)) {\r\n        throw new ValidationError('Participants must be an array', 'participants', updates.participants);\r\n      }\r\n      this.participants = [...updates.participants];\r\n      // Ensure booking owner is in participants\r\n      if (!this.participants.includes(this.memberId)) {\r\n        this.participants.unshift(this.memberId);\r\n      }\r\n    }\r\n    if (updates.notes !== undefined) {\r\n      this.notes = updates.notes || '';\r\n    }\r\n\r\n    this.updatedDate = new Date();\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Get booking type reference (requires BookingType instances to be provided)\r\n   * @param {Array<BookingType>} bookingTypes - Available booking types\r\n   * @returns {BookingType|null} BookingType instance or null if not found\r\n   */\r\n  getBookingType(bookingTypes) {\r\n    if (!Array.isArray(bookingTypes)) {\r\n      return null;\r\n    }\r\n\r\n    return bookingTypes.find(type => type._id === this.bookingTypeId) || null;\r\n  }\r\n\r\n  /**\r\n   * Check if booking overlaps with another booking\r\n   * @param {Booking} otherBooking - Other booking to check\r\n   * @returns {boolean} True if bookings overlap\r\n   */\r\n  overlapsWith(otherBooking) {\r\n    if (!otherBooking || !(otherBooking instanceof Booking)) {\r\n      return false;\r\n    }\r\n\r\n    // Different rinks don't overlap\r\n    if (this.rinkId !== otherBooking.rinkId) {\r\n      return false;\r\n    }\r\n\r\n    // Different dates don't overlap\r\n    if (this.date.toDateString() !== otherBooking.date.toDateString()) {\r\n      return false;\r\n    }\r\n\r\n    // Check time overlap\r\n    return this.start < otherBooking.end && this.end > otherBooking.start;\r\n  }\r\n\r\n  /**\r\n   * Convert to JSON string for persistence\r\n   * @returns {string} JSON string representation\r\n   */\r\n  toJSON() {\r\n    const data = {\r\n      _id: this._id,\r\n      memberId: this.memberId,\r\n      rinkId: this.rinkId,\r\n      bookingTypeId: this.bookingTypeId,\r\n      date: this.date.toISOString().split('T')[0], // Date only\r\n      start: this.start.toISOString(),\r\n      end: this.end.toISOString(),\r\n      status: this.status,\r\n      participants: [...this.participants],\r\n      notes: this.notes,\r\n      createdDate: this.createdDate.toISOString(),\r\n      updatedDate: this.updatedDate.toISOString()\r\n    };\r\n    return JSON.stringify(data);\r\n  }\r\n\r\n  /**\r\n   * Create Booking instance from JSON string\r\n   * @param {string} jsonString - JSON string data\r\n   * @returns {Booking} New Booking instance\r\n   */\r\n  static fromJSON(jsonString) {\r\n    if (!jsonString || typeof jsonString !== 'string') {\r\n      throw new ValidationError('Valid JSON string is required');\r\n    }\r\n\r\n    let jsonData;\r\n    try {\r\n      jsonData = JSON.parse(jsonString);\r\n    } catch (error) {\r\n      throw new ValidationError('Invalid JSON string format');\r\n    }\r\n\r\n    return new Booking({\r\n      _id: jsonData._id,\r\n      memberId: jsonData.memberId,\r\n      rinkId: jsonData.rinkId,\r\n      bookingTypeId: jsonData.bookingTypeId,\r\n      date: new Date(jsonData.date),\r\n      start: new Date(jsonData.start),\r\n      end: new Date(jsonData.end),\r\n      status: jsonData.status,\r\n      participants: jsonData.participants || [],\r\n      notes: jsonData.notes || '',\r\n      createdDate: jsonData.createdDate ? new Date(jsonData.createdDate) : new Date(),\r\n      updatedDate: jsonData.updatedDate ? new Date(jsonData.updatedDate) : new Date()\r\n    });\r\n  }\r\n} ","import { v4 as uuidv4 } from 'uuid';\r\nimport { ValidationError } from '../utils/errors.js';\r\nimport { validateColor } from '../utils/validators.js';\r\n\r\n/**\r\n * Represents a type of booking with visual styling and restrictions\r\n */\r\nexport class BookingType {\r\n  /**\r\n   * Create a new BookingType\r\n   * @param {Object} data - BookingType configuration\r\n   * @param {string} [data._id] - Unique identifier (auto-generated if not provided)\r\n   * @param {string} data.name - Display name for the booking type\r\n   * @param {string} data.backgroundColor - Background color (hex color)\r\n   * @param {string} data.foregroundColor - Text/foreground color (hex color)\r\n   * @param {string} [data.description] - Optional description\r\n   * @param {number} [data.priority=1] - Numeric priority for conflicts (higher = more important)\r\n   */\r\n  constructor(data) {\r\n    if (!data || typeof data !== 'object') {\r\n      throw new ValidationError('BookingType data is required');\r\n    }\r\n\r\n    if (!data.name || typeof data.name !== 'string') {\r\n      throw new ValidationError('Name is required', 'name', data.name);\r\n    }\r\n\r\n    if (!data.backgroundColor) {\r\n      throw new ValidationError('Background color is required', 'backgroundColor', data.backgroundColor);\r\n    }\r\n\r\n    if (!data.foregroundColor) {\r\n      throw new ValidationError('Foreground color is required', 'foregroundColor', data.foregroundColor);\r\n    }\r\n\r\n    // Validate colors\r\n    validateColor(data.backgroundColor, 'backgroundColor');\r\n    validateColor(data.foregroundColor, 'foregroundColor');\r\n\r\n    this._id = data._id || uuidv4();\r\n    this.name = data.name.trim();\r\n    this.backgroundColor = data.backgroundColor;\r\n    this.foregroundColor = data.foregroundColor;\r\n    this.description = data.description ? data.description.trim() : '';\r\n    this.priority = typeof data.priority === 'number' ? data.priority : 1;\r\n\r\n    // Validate priority range\r\n    if (this.priority < 1 || this.priority > 100) {\r\n      throw new ValidationError('Priority must be between 1 and 100', 'priority', this.priority);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update booking type properties\r\n   * @param {Object} updates - Properties to update\r\n   * @returns {BookingType} This instance for chaining\r\n   */\r\n  update(updates) {\r\n    if (!updates || typeof updates !== 'object') {\r\n      throw new ValidationError('Updates object is required');\r\n    }\r\n\r\n    // Validate updates without applying them first\r\n    const allowedFields = ['name', 'backgroundColor', 'foregroundColor', 'description', 'priority'];\r\n    const updateKeys = Object.keys(updates);\r\n\r\n    for (const key of updateKeys) {\r\n      if (!allowedFields.includes(key)) {\r\n        throw new ValidationError(`Field '${key}' cannot be updated`, key, updates[key]);\r\n      }\r\n    }\r\n\r\n    // Validate specific field types\r\n    if (updates.name !== undefined) {\r\n      if (!updates.name || typeof updates.name !== 'string') {\r\n        throw new ValidationError('Name must be a non-empty string', 'name', updates.name);\r\n      }\r\n    }\r\n\r\n    if (updates.backgroundColor !== undefined) {\r\n      validateColor(updates.backgroundColor, 'backgroundColor');\r\n    }\r\n\r\n    if (updates.foregroundColor !== undefined) {\r\n      validateColor(updates.foregroundColor, 'foregroundColor');\r\n    }\r\n\r\n    if (updates.priority !== undefined) {\r\n      if (typeof updates.priority !== 'number' || updates.priority < 1 || updates.priority > 100) {\r\n        throw new ValidationError('Priority must be a number between 1 and 100', 'priority', updates.priority);\r\n      }\r\n    }\r\n\r\n    // Apply updates\r\n    if (updates.name !== undefined) {\r\n      this.name = updates.name.trim();\r\n    }\r\n    if (updates.backgroundColor !== undefined) {\r\n      this.backgroundColor = updates.backgroundColor;\r\n    }\r\n    if (updates.foregroundColor !== undefined) {\r\n      this.foregroundColor = updates.foregroundColor;\r\n    }\r\n    if (updates.description !== undefined) {\r\n      this.description = updates.description ? updates.description.trim() : '';\r\n    }\r\n    if (updates.priority !== undefined) {\r\n      this.priority = updates.priority;\r\n    }\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Convert to JSON string for persistence\r\n   * @returns {string} JSON string representation\r\n   */\r\n  toJSON() {\r\n    const data = {\r\n      _id: this._id,\r\n      name: this.name,\r\n      backgroundColor: this.backgroundColor,\r\n      foregroundColor: this.foregroundColor,\r\n      description: this.description,\r\n      priority: this.priority\r\n    };\r\n    return JSON.stringify(data);\r\n  }\r\n\r\n  /**\r\n   * Create BookingType instance from JSON string\r\n   * @param {string} jsonString - JSON string data\r\n   * @returns {BookingType} New BookingType instance\r\n   */\r\n  static fromJSON(jsonString) {\r\n    if (!jsonString || typeof jsonString !== 'string') {\r\n      throw new ValidationError('Valid JSON string is required');\r\n    }\r\n\r\n    let jsonData;\r\n    try {\r\n      jsonData = JSON.parse(jsonString);\r\n    } catch (error) {\r\n      throw new ValidationError('Invalid JSON string format');\r\n    }\r\n\r\n    return new BookingType(jsonData);\r\n  }\r\n\r\n  /**\r\n   * Get default booking types\r\n   * @returns {Array<BookingType>} Array of default booking types\r\n   */\r\n  static getDefaults() {\r\n    return [\r\n      new BookingType({\r\n        _id: 'regular',\r\n        name: 'Regular Booking',\r\n        backgroundColor: '#4CAF50',\r\n        foregroundColor: '#FFFFFF',\r\n        description: 'Standard green booking',\r\n        priority: 1\r\n      }),\r\n      new BookingType({\r\n        _id: 'maintenance',\r\n        name: 'Maintenance',\r\n        backgroundColor: '#FF9800',\r\n        foregroundColor: '#000000',\r\n        description: 'Green maintenance and repairs',\r\n        priority: 10\r\n      }),\r\n      new BookingType({\r\n        _id: 'tournament',\r\n        name: 'Tournament',\r\n        backgroundColor: '#9C27B0',\r\n        foregroundColor: '#FFFFFF',\r\n        description: 'Tournament or competition booking',\r\n        priority: 5\r\n      })\r\n    ];\r\n  }\r\n} ","import { v4 as uuidv4 } from 'uuid';\r\nimport { ValidationError } from '../utils/errors.js';\r\n\r\n/**\r\n * Represents an audit log entry for tracking system changes\r\n */\r\nexport class AuditLogEntry {\r\n  /**\r\n   * Create a new AuditLogEntry\r\n   * @param {Object} data - AuditLogEntry configuration\r\n   * @param {string} [data._id] - Unique identifier (auto-generated if not provided)\r\n   * @param {string} data.action - Type of action performed\r\n   * @param {string} data.entityType - Type of entity affected\r\n   * @param {string} data.entityId - ID of the affected entity\r\n   * @param {string} data.memberId - ID of member who performed the action\r\n   * @param {Date} [data.timestamp] - When the action occurred (defaults to now)\r\n   * @param {Object} [data.oldValues] - Previous values (for updates)\r\n   * @param {Object} [data.newValues] - New values (for creates/updates)\r\n   * @param {Object} [data.metadata] - Additional context information\r\n   */\r\n  constructor(data) {\r\n    if (!data || typeof data !== 'object') {\r\n      throw new ValidationError('AuditLogEntry data is required');\r\n    }\r\n\r\n    // Validate required fields\r\n    if (!data.action || typeof data.action !== 'string') {\r\n      throw new ValidationError('Action is required', 'action', data.action);\r\n    }\r\n\r\n    if (!data.entityType || typeof data.entityType !== 'string') {\r\n      throw new ValidationError('Entity type is required', 'entityType', data.entityType);\r\n    }\r\n\r\n    if (!data.entityId || typeof data.entityId !== 'string') {\r\n      throw new ValidationError('Entity ID is required', 'entityId', data.entityId);\r\n    }\r\n\r\n    if (!data.memberId || typeof data.memberId !== 'string') {\r\n      throw new ValidationError('Member ID is required', 'memberId', data.memberId);\r\n    }\r\n\r\n    // Validate action types\r\n    const validActions = ['create', 'update', 'delete', 'cancel'];\r\n    if (!validActions.includes(data.action)) {\r\n      throw new ValidationError(\r\n        `Invalid action. Must be one of: ${validActions.join(', ')}`,\r\n        'action',\r\n        data.action\r\n      );\r\n    }\r\n\r\n    // Validate entity types\r\n    const validEntityTypes = ['booking', 'green', 'rink', 'bookingType', 'timeSlot', 'system'];\r\n    if (!validEntityTypes.includes(data.entityType)) {\r\n      throw new ValidationError(\r\n        `Invalid entity type. Must be one of: ${validEntityTypes.join(', ')}`,\r\n        'entityType',\r\n        data.entityType\r\n      );\r\n    }\r\n\r\n    this._id = data._id || uuidv4();\r\n    this.action = data.action;\r\n    this.entityType = data.entityType;\r\n    this.entityId = data.entityId;\r\n    this.memberId = data.memberId;\r\n    this.timestamp = data.timestamp ? new Date(data.timestamp) : new Date();\r\n    this.oldValues = data.oldValues || null;\r\n    this.newValues = data.newValues || null;\r\n    this.metadata = data.metadata || {};\r\n\r\n    // Validate timestamp\r\n    if (!(this.timestamp instanceof Date) || isNaN(this.timestamp.getTime())) {\r\n      throw new ValidationError('Invalid timestamp', 'timestamp', data.timestamp);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get a summary description of this audit entry\r\n   * @returns {string} Human-readable description\r\n   */\r\n  getDescription() {\r\n    const actionMap = {\r\n      create: 'created',\r\n      update: 'updated',\r\n      delete: 'deleted',\r\n      cancel: 'cancelled'\r\n    };\r\n\r\n    const actionText = actionMap[this.action] || this.action;\r\n    return `${this.entityType} ${this.entityId} was ${actionText} by ${this.memberId}`;\r\n  }\r\n\r\n  /**\r\n   * Check if this entry relates to a specific entity\r\n   * @param {string} entityType - Entity type to check\r\n   * @param {string} entityId - Entity ID to check\r\n   * @returns {boolean} True if entry relates to the entity\r\n   */\r\n  relatesTo(entityType, entityId) {\r\n    return this.entityType === entityType && this.entityId === entityId;\r\n  }\r\n\r\n  /**\r\n   * Check if this entry was made by a specific member\r\n   * @param {string} memberId - Member ID to check\r\n   * @returns {boolean} True if entry was made by the member\r\n   */\r\n  madeBy(memberId) {\r\n    return this.memberId === memberId;\r\n  }\r\n\r\n  /**\r\n   * Check if this entry occurred within a date range\r\n   * @param {Date} startDate - Start of date range\r\n   * @param {Date} endDate - End of date range\r\n   * @returns {boolean} True if entry occurred within range\r\n   */\r\n  withinDateRange(startDate, endDate) {\r\n    if (!startDate || !endDate) {\r\n      return true; // No range specified\r\n    }\r\n\r\n    return this.timestamp >= startDate && this.timestamp <= endDate;\r\n  }\r\n\r\n  /**\r\n   * Get the changed fields (for update operations)\r\n   * @returns {Array<string>} Array of field names that changed\r\n   */\r\n  getChangedFields() {\r\n    if (this.action !== 'update' || !this.oldValues || !this.newValues) {\r\n      return [];\r\n    }\r\n\r\n    const changedFields = [];\r\n    const allKeys = new Set([\r\n      ...Object.keys(this.oldValues),\r\n      ...Object.keys(this.newValues)\r\n    ]);\r\n\r\n    for (const key of allKeys) {\r\n      const oldValue = this.oldValues[key];\r\n      const newValue = this.newValues[key];\r\n      \r\n      if (JSON.stringify(oldValue) !== JSON.stringify(newValue)) {\r\n        changedFields.push(key);\r\n      }\r\n    }\r\n\r\n    return changedFields;\r\n  }\r\n\r\n  /**\r\n   * Convert to JSON string for persistence\r\n   * @returns {string} JSON string representation\r\n   */\r\n  toJSON() {\r\n    const data = {\r\n      _id: this._id,\r\n      action: this.action,\r\n      entityType: this.entityType,\r\n      entityId: this.entityId,\r\n      memberId: this.memberId,\r\n      timestamp: this.timestamp.toISOString(),\r\n      oldValues: this.oldValues,\r\n      newValues: this.newValues,\r\n      metadata: this.metadata\r\n    };\r\n    return JSON.stringify(data);\r\n  }\r\n\r\n  /**\r\n   * Create AuditLogEntry instance from JSON string\r\n   * @param {string} jsonString - JSON string data\r\n   * @returns {AuditLogEntry} New AuditLogEntry instance\r\n   */\r\n  static fromJSON(jsonString) {\r\n    if (!jsonString || typeof jsonString !== 'string') {\r\n      throw new ValidationError('Valid JSON string is required');\r\n    }\r\n\r\n    let jsonData;\r\n    try {\r\n      jsonData = JSON.parse(jsonString);\r\n    } catch (error) {\r\n      throw new ValidationError('Invalid JSON string format');\r\n    }\r\n\r\n    return new AuditLogEntry({\r\n      _id: jsonData._id,\r\n      action: jsonData.action,\r\n      entityType: jsonData.entityType,\r\n      entityId: jsonData.entityId,\r\n      memberId: jsonData.memberId,\r\n      timestamp: jsonData.timestamp ? new Date(jsonData.timestamp) : new Date(),\r\n      oldValues: jsonData.oldValues,\r\n      newValues: jsonData.newValues,\r\n      metadata: jsonData.metadata\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Create audit log entry for entity creation\r\n   * @param {string} entityType - Type of entity\r\n   * @param {string} entityId - Entity ID\r\n   * @param {string} memberId - Member who created\r\n   * @param {Object} values - Entity values\r\n   * @param {Object} metadata - Additional metadata\r\n   * @returns {AuditLogEntry} New audit log entry\r\n   */\r\n  static createEntry(entityType, entityId, memberId, values, metadata = {}) {\r\n    return new AuditLogEntry({\r\n      action: 'create',\r\n      entityType,\r\n      entityId,\r\n      memberId,\r\n      newValues: values,\r\n      metadata\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Create audit log entry for entity update\r\n   * @param {string} entityType - Type of entity\r\n   * @param {string} entityId - Entity ID\r\n   * @param {string} memberId - Member who updated\r\n   * @param {Object} oldValues - Previous values\r\n   * @param {Object} newValues - New values\r\n   * @param {Object} metadata - Additional metadata\r\n   * @returns {AuditLogEntry} New audit log entry\r\n   */\r\n  static updateEntry(entityType, entityId, memberId, oldValues, newValues, metadata = {}) {\r\n    return new AuditLogEntry({\r\n      action: 'update',\r\n      entityType,\r\n      entityId,\r\n      memberId,\r\n      oldValues,\r\n      newValues,\r\n      metadata\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Create audit log entry for entity deletion\r\n   * @param {string} entityType - Type of entity\r\n   * @param {string} entityId - Entity ID\r\n   * @param {string} memberId - Member who deleted\r\n   * @param {Object} values - Entity values before deletion\r\n   * @param {Object} metadata - Additional metadata\r\n   * @returns {AuditLogEntry} New audit log entry\r\n   */\r\n  static deleteEntry(entityType, entityId, memberId, values, metadata = {}) {\r\n    return new AuditLogEntry({\r\n      action: 'delete',\r\n      entityType,\r\n      entityId,\r\n      memberId,\r\n      oldValues: values,\r\n      metadata\r\n    });\r\n  }\r\n} ","import { v4 as uuidv4 } from 'uuid';\r\nimport { ValidationError } from '../utils/errors.js';\r\nimport { validateTimeSlot } from '../utils/validators.js';\r\n\r\n/**\r\n * Represents available booking time slots\r\n */\r\nexport class TimeSlot {\r\n  /**\r\n   * Create a new TimeSlot\r\n   * @param {Object} data - TimeSlot configuration\r\n   * @param {string} [data._id] - Unique identifier (auto-generated if not provided)\r\n   * @param {Date} data.start - Slot start time\r\n   * @param {Date} data.end - Slot end time\r\n   * @param {boolean} [data.isRecurring=false] - Boolean indicating if slot repeats\r\n   * @param {string} [data.recurringPattern] - Pattern for recurring slots\r\n   */\r\n  constructor(data) {\r\n    if (!data || typeof data !== 'object') {\r\n      throw new ValidationError('TimeSlot data is required');\r\n    }\r\n\r\n    // Validate the time slot data\r\n    validateTimeSlot(data);\r\n\r\n    this._id = data._id || uuidv4();\r\n    this.start = new Date(data.start);\r\n    this.end = new Date(data.end);\r\n    this.isRecurring = Boolean(data.isRecurring);\r\n    this.recurringPattern = data.recurringPattern || null;\r\n\r\n    // Validate recurring pattern if provided\r\n    if (this.isRecurring && this.recurringPattern) {\r\n      const validPatterns = ['daily', 'weekly', 'monthly', 'yearly'];\r\n      if (!validPatterns.includes(this.recurringPattern)) {\r\n        throw new ValidationError(\r\n          'Invalid recurring pattern. Must be one of: ' + validPatterns.join(', '),\r\n          'recurringPattern',\r\n          this.recurringPattern\r\n        );\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check if a given time falls within this slot\r\n   * @param {Date} time - Time to check\r\n   * @returns {boolean} True if time falls within slot\r\n   */\r\n  isWithinSlot(time) {\r\n    if (!time || !(time instanceof Date)) {\r\n      return false;\r\n    }\r\n    \r\n    return time >= this.start && time <= this.end;\r\n  }\r\n\r\n  /**\r\n   * Check if this slot overlaps with another time period\r\n   * @param {Date} start - Start time to check\r\n   * @param {Date} end - End time to check\r\n   * @returns {boolean} True if there's an overlap\r\n   */\r\n  overlaps(start, end) {\r\n    if (!start || !end || !(start instanceof Date) || !(end instanceof Date)) {\r\n      return false;\r\n    }\r\n\r\n    return this.start < end && this.end > start;\r\n  }\r\n\r\n  /**\r\n   * Get the duration of this time slot in minutes\r\n   * @returns {number} Duration in minutes\r\n   */\r\n  getDuration() {\r\n    return Math.round((this.end - this.start) / (1000 * 60));\r\n  }\r\n\r\n  /**\r\n   * Generate recurring instances of this time slot\r\n   * @param {Date} fromDate - Start date for generation\r\n   * @param {Date} toDate - End date for generation\r\n   * @returns {Array<TimeSlot>} Array of time slot instances\r\n   */\r\n  generateRecurringInstances(fromDate, toDate) {\r\n    if (!this.isRecurring || !this.recurringPattern) {\r\n      return [this];\r\n    }\r\n\r\n    if (!fromDate || !toDate || !(fromDate instanceof Date) || !(toDate instanceof Date)) {\r\n      throw new ValidationError('Valid from and to dates are required');\r\n    }\r\n\r\n    const instances = [];\r\n    const duration = this.getDuration();\r\n    let currentDate = new Date(fromDate);\r\n\r\n    while (currentDate <= toDate) {\r\n      // Create slot for current date\r\n      const slotStart = new Date(currentDate);\r\n      slotStart.setHours(this.start.getHours(), this.start.getMinutes(), 0, 0);\r\n      \r\n      const slotEnd = new Date(slotStart);\r\n      slotEnd.setMinutes(slotEnd.getMinutes() + duration);\r\n\r\n      if (slotStart >= fromDate && slotStart <= toDate) {\r\n        instances.push(new TimeSlot({\r\n          start: slotStart,\r\n          end: slotEnd,\r\n          isRecurring: false // Individual instances are not recurring\r\n        }));\r\n      }\r\n\r\n      // Move to next occurrence\r\n      switch (this.recurringPattern) {\r\n        case 'daily':\r\n          currentDate.setDate(currentDate.getDate() + 1);\r\n          break;\r\n        case 'weekly':\r\n          currentDate.setDate(currentDate.getDate() + 7);\r\n          break;\r\n        case 'monthly':\r\n          currentDate.setMonth(currentDate.getMonth() + 1);\r\n          break;\r\n        case 'yearly':\r\n          currentDate.setFullYear(currentDate.getFullYear() + 1);\r\n          break;\r\n        default:\r\n          // Unknown pattern, break to avoid infinite loop\r\n          break;\r\n      }\r\n    }\r\n\r\n    return instances;\r\n  }\r\n\r\n  /**\r\n   * Convert to JSON string for persistence\r\n   * @returns {string} JSON string representation\r\n   */\r\n  toJSON() {\r\n    const data = {\r\n      _id: this._id,\r\n      start: this.start.toISOString(),\r\n      end: this.end.toISOString(),\r\n      isRecurring: this.isRecurring,\r\n      recurringPattern: this.recurringPattern\r\n    };\r\n    return JSON.stringify(data);\r\n  }\r\n\r\n  /**\r\n   * Create TimeSlot instance from JSON string\r\n   * @param {string} jsonString - JSON string data\r\n   * @returns {TimeSlot} New TimeSlot instance\r\n   */\r\n  static fromJSON(jsonString) {\r\n    if (!jsonString || typeof jsonString !== 'string') {\r\n      throw new ValidationError('Valid JSON string is required');\r\n    }\r\n\r\n    let jsonData;\r\n    try {\r\n      jsonData = JSON.parse(jsonString);\r\n    } catch (error) {\r\n      throw new ValidationError('Invalid JSON string format');\r\n    }\r\n\r\n    return new TimeSlot({\r\n      _id: jsonData._id,\r\n      start: new Date(jsonData.start),\r\n      end: new Date(jsonData.end),\r\n      isRecurring: jsonData.isRecurring,\r\n      recurringPattern: jsonData.recurringPattern\r\n    });\r\n  }\r\n} ","import { v4 as uuidv4 } from 'uuid';\r\n// Note: Temporal polyfill should be imported by the consuming application\r\n// import '@js-temporal/polyfill/global';\r\n\r\nimport { ValidationError, BookingConflictError, MemberPermissionError } from '../utils/errors.js';\r\nimport { validateBooking, validateMember } from '../utils/validators.js';\r\nimport { isTimeSlotAvailable, calculateDuration } from '../utils/calculators.js';\r\n\r\nimport { Green } from './Green.js';\r\nimport { Rink } from './Rink.js';\r\nimport { Booking } from './Booking.js';\r\nimport { BookingType } from './BookingType.js';\r\nimport { AuditLogEntry } from './AuditLogEntry.js';\r\nimport { TimeSlot } from './TimeSlot.js';\r\n\r\n/**\r\n * Default system settings configuration\r\n */\r\nconst DEFAULT_SETTINGS = {\r\n  bookingRules: {\r\n    maxAdvanceBookingDays: 30,\r\n    minAdvanceBookingHours: 2,\r\n    maxBookingDuration: 180, // minutes\r\n    minBookingDuration: 60,  // minutes\r\n    allowConcurrentBookings: false,\r\n    requireApproval: false\r\n  },\r\n  dataRetention: {\r\n    bookingRetentionDays: 365,     // Keep bookings for 1 year\r\n    auditLogRetentionDays: 1095,   // Keep audit logs for 3 years\r\n    autoCleanupEnabled: true,      // Enable automatic cleanup\r\n    cleanupIntervalDays: 30        // Run cleanup every 30 days\r\n  },\r\n  notifications: {\r\n    sendConfirmationEmail: true,\r\n    sendReminderEmail: true,\r\n    reminderHours: 24\r\n  }\r\n};\r\n\r\n/**\r\n * The primary class managing all booking operations\r\n */\r\nexport class BookingSystem {\r\n  /**\r\n   * Create a new BookingSystem\r\n   * @param {Object} data - BookingSystem configuration\r\n   * @param {string} [data._id] - Unique identifier (auto-generated if not provided)\r\n   * @param {string} data.club - ID of the club that owns this booking system\r\n   * @param {Object} [data.settings] - Configuration object for booking rules\r\n   * @param {Array} [data.greens] - Array of Green instances or data\r\n   * @param {Array} [data.bookings] - Array of Booking instances or data\r\n   * @param {Array} [data.bookingTypes] - Array of BookingType instances or data\r\n   * @param {Array} [data.members] - Array of member objects with {_id: GUID, name: string, preferences: Object}\r\n   * @param {Array} [data.timeSlots] - Array of TimeSlot instances or data\r\n   * @param {Array} [data.auditLog] - Array of audit log entries\r\n   */\r\n  constructor(data) {\r\n    if (!data || typeof data !== 'object') {\r\n      throw new ValidationError('BookingSystem data is required');\r\n    }\r\n\r\n    if (!data.club || typeof data.club !== 'string') {\r\n      throw new ValidationError('Club ID is required', 'club', data.club);\r\n    }\r\n\r\n    this._id = data._id || uuidv4();\r\n    this.club = data.club;\r\n    this.settings = { ...DEFAULT_SETTINGS, ...(data.settings || {}) };\r\n    \r\n    // Initialize collections\r\n    this.greens = [];\r\n    this.bookings = [];\r\n    this.bookingTypes = [];\r\n    this.timeSlots = [];\r\n    this.auditLog = [];\r\n    this.members = [];\r\n\r\n    // Initialize members from data\r\n    if (Array.isArray(data.members)) {\r\n      this.members = data.members.map(member => ({\r\n        _id: member._id,\r\n        name: member.name,\r\n        preferences: { ...member.preferences }\r\n      }));\r\n    }\r\n\r\n    // Initialize greens\r\n    if (Array.isArray(data.greens)) {\r\n      for (const greenData of data.greens) {\r\n        this.addGreen(greenData instanceof Green ? greenData : Green.fromJSON(JSON.stringify(greenData)));\r\n      }\r\n    }\r\n\r\n    // Initialize booking types (add defaults if none provided)\r\n    if (Array.isArray(data.bookingTypes) && data.bookingTypes.length > 0) {\r\n      for (const bookingTypeData of data.bookingTypes) {\r\n        this.addBookingType(bookingTypeData instanceof BookingType ? bookingTypeData : BookingType.fromJSON(JSON.stringify(bookingTypeData)));\r\n      }\r\n    } else {\r\n      // Add default booking types\r\n      for (const defaultType of BookingType.getDefaults()) {\r\n        this.addBookingType(defaultType);\r\n      }\r\n    }\r\n\r\n    // Initialize bookings\r\n    if (Array.isArray(data.bookings)) {\r\n      for (const bookingData of data.bookings) {\r\n        this.bookings.push(bookingData instanceof Booking ? bookingData : Booking.fromJSON(JSON.stringify(bookingData)));\r\n      }\r\n    }\r\n\r\n    // Initialize time slots\r\n    if (Array.isArray(data.timeSlots)) {\r\n      for (const timeSlotData of data.timeSlots) {\r\n        this.timeSlots.push(timeSlotData instanceof TimeSlot ? timeSlotData : TimeSlot.fromJSON(JSON.stringify(timeSlotData)));\r\n      }\r\n    }\r\n\r\n    // Initialize audit log\r\n    if (Array.isArray(data.auditLog)) {\r\n      for (const auditData of data.auditLog) {\r\n        this.auditLog.push(auditData instanceof AuditLogEntry ? auditData : AuditLogEntry.fromJSON(JSON.stringify(auditData)));\r\n      }\r\n    }\r\n\r\n    this._lastCleanup = data._lastCleanup ? new Date(data._lastCleanup) : new Date();\r\n  }\r\n\r\n  /**\r\n   * Add a green to the system\r\n   * @param {Green|Object} green - Green instance or green data\r\n   * @returns {BookingSystem} This instance for chaining\r\n   */\r\n  addGreen(green) {\r\n    let greenInstance;\r\n    if (green instanceof Green) {\r\n      greenInstance = green;\r\n    } else if (green && typeof green === 'object') {\r\n      greenInstance = new Green(green);\r\n    } else {\r\n      throw new ValidationError('Valid green data or Green instance is required', 'green', green);\r\n    }\r\n\r\n    // Check for duplicate green names\r\n    const existingGreen = this.greens.find(g => g.name === greenInstance.name);\r\n    if (existingGreen) {\r\n      throw new ValidationError(`Green with name '${greenInstance.name}' already exists`, 'greenName', greenInstance.name);\r\n    }\r\n\r\n    this.greens.push(greenInstance);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Remove a green from the system\r\n   * @param {string} greenId - Green ID to remove\r\n   * @param {string} memberId - Member performing the action\r\n   * @returns {BookingSystem} This instance for chaining\r\n   */\r\n  removeGreen(greenId, memberId) {\r\n    validateMember(memberId, 'remove_green');\r\n\r\n    const index = this.greens.findIndex(green => green._id === greenId);\r\n    if (index === -1) {\r\n      throw new ValidationError('Green not found', 'greenId', greenId);\r\n    }\r\n\r\n    const green = this.greens[index];\r\n\r\n    // Check for existing bookings on this green\r\n    const greenBookings = this.getRinkBookings(greenId);\r\n    const futureBookings = greenBookings.filter(booking => \r\n      booking.isFuture() && (booking.status === 'pending' || booking.status === 'confirmed')\r\n    );\r\n\r\n    if (futureBookings.length > 0) {\r\n      throw new ValidationError(\r\n        'Cannot remove green with active future bookings',\r\n        'activeBookings',\r\n        futureBookings.length\r\n      );\r\n    }\r\n\r\n    // Add audit log entry\r\n    this._addAuditEntry(AuditLogEntry.deleteEntry('green', greenId, memberId, JSON.parse(green.toJSON())));\r\n\r\n    this.greens.splice(index, 1);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Add a booking type to the system\r\n   * @param {BookingType|Object} bookingType - BookingType instance or data\r\n   * @returns {BookingSystem} This instance for chaining\r\n   */\r\n  addBookingType(bookingType) {\r\n    let bookingTypeInstance;\r\n    if (bookingType instanceof BookingType) {\r\n      bookingTypeInstance = bookingType;\r\n    } else if (bookingType && typeof bookingType === 'object') {\r\n      bookingTypeInstance = new BookingType(bookingType);\r\n    } else {\r\n      throw new ValidationError('Valid booking type data or BookingType instance is required', 'bookingType', bookingType);\r\n    }\r\n\r\n    // Check for duplicate booking type names\r\n    const existingType = this.bookingTypes.find(t => t.name === bookingTypeInstance.name);\r\n    if (existingType) {\r\n      throw new ValidationError(`Booking type with name '${bookingTypeInstance.name}' already exists`, 'bookingTypeName', bookingTypeInstance.name);\r\n    }\r\n\r\n    this.bookingTypes.push(bookingTypeInstance);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Remove a booking type from the system\r\n   * @param {string} bookingTypeId - Booking type ID to remove\r\n   * @param {string} memberId - Member performing the action\r\n   * @returns {BookingSystem} This instance for chaining\r\n   */\r\n  removeBookingType(bookingTypeId, memberId) {\r\n    validateMember(memberId, 'remove_booking_type');\r\n\r\n    const index = this.bookingTypes.findIndex(type => type._id === bookingTypeId);\r\n    if (index === -1) {\r\n      throw new ValidationError('Booking type not found', 'bookingTypeId', bookingTypeId);\r\n    }\r\n\r\n    // Check for existing bookings using this type\r\n    const typeBookings = this.bookings.filter(booking => booking.bookingTypeId === bookingTypeId);\r\n    const futureBookings = typeBookings.filter(booking => \r\n      booking.isFuture() && (booking.status === 'pending' || booking.status === 'confirmed')\r\n    );\r\n\r\n    if (futureBookings.length > 0) {\r\n      throw new ValidationError(\r\n        'Cannot remove booking type with active future bookings',\r\n        'activeBookings',\r\n        futureBookings.length\r\n      );\r\n    }\r\n\r\n    const bookingType = this.bookingTypes[index];\r\n    \r\n    // Add audit log entry\r\n    this._addAuditEntry(AuditLogEntry.deleteEntry('bookingType', bookingTypeId, memberId, JSON.parse(bookingType.toJSON())));\r\n\r\n    this.bookingTypes.splice(index, 1);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Create a new booking\r\n   * @param {Object} bookingData - Booking data\r\n   * @param {string} memberId - Member creating the booking\r\n   * @returns {Booking} Created booking instance\r\n   */\r\n  createBooking(bookingData, memberId) {\r\n    validateMember(memberId, 'create_booking');\r\n    validateBooking(bookingData);\r\n\r\n    // Validate booking rules\r\n    this._validateBookingRules(bookingData);\r\n\r\n    // Find the green and rink\r\n    const green = this._findGreenByRinkId(bookingData.rinkId);\r\n    if (!green) {\r\n      throw new ValidationError('Rink not found in any green', 'rinkId', bookingData.rinkId);\r\n    }\r\n\r\n    // Validate the booking can be made\r\n    green.validateBooking(\r\n      bookingData.rinkId,\r\n      bookingData.bookingTypeId,\r\n      bookingData.date,\r\n      bookingData.start,\r\n      bookingData.end,\r\n      this.bookings\r\n    );\r\n\r\n    // Check for conflicts\r\n    if (!this.settings.bookingRules.allowConcurrentBookings) {\r\n      const conflicts = this.findBookingConflicts(\r\n        bookingData.rinkId,\r\n        bookingData.date,\r\n        bookingData.start,\r\n        bookingData.end\r\n      );\r\n\r\n      if (conflicts.length > 0) {\r\n        throw new BookingConflictError('Booking conflicts with existing reservation', conflicts[0]);\r\n      }\r\n    }\r\n\r\n    // Create the booking\r\n    const booking = new Booking({\r\n      ...bookingData,\r\n      memberId: bookingData.memberId || memberId,\r\n      status: this.settings.bookingRules.requireApproval ? 'pending' : 'confirmed'\r\n    });\r\n\r\n    this.bookings.push(booking);\r\n\r\n    // Add audit log entry\r\n    this._addAuditEntry(AuditLogEntry.createEntry('booking', booking._id, memberId, JSON.parse(booking.toJSON())));\r\n\r\n    return booking;\r\n  }\r\n\r\n  /**\r\n   * Modify an existing booking\r\n   * @param {string} bookingId - Booking ID to modify\r\n   * @param {Object} updates - Updates to apply\r\n   * @param {string} memberId - Member making the modification\r\n   * @returns {Booking} Updated booking instance\r\n   */\r\n  modifyBooking(bookingId, updates, memberId) {\r\n    validateMember(memberId, 'modify_booking');\r\n\r\n    const booking = this.bookings.find(b => b._id === bookingId);\r\n    if (!booking) {\r\n      throw new ValidationError('Booking not found', 'bookingId', bookingId);\r\n    }\r\n\r\n    if (!booking.canModify()) {\r\n      throw new ValidationError(`Cannot modify booking with status: ${booking.status}`, 'status', booking.status);\r\n    }\r\n\r\n    // Store old values for audit log\r\n    const oldValues = JSON.parse(booking.toJSON());\r\n\r\n    // If time/date changes, validate rules and conflicts\r\n    if (updates.date || updates.start || updates.end || updates.rinkId) {\r\n      const newDate = updates.date ? new Date(updates.date) : booking.date;\r\n      const newStart = updates.start ? new Date(updates.start) : booking.start;\r\n      const newEnd = updates.end ? new Date(updates.end) : booking.end;\r\n      const newRinkId = updates.rinkId || booking.rinkId;\r\n\r\n      // Validate booking rules for new time\r\n      this._validateBookingRules({\r\n        date: newDate,\r\n        start: newStart,\r\n        end: newEnd,\r\n        rinkId: newRinkId,\r\n        bookingTypeId: updates.bookingTypeId || booking.bookingTypeId\r\n      });\r\n\r\n      // Check for conflicts (excluding this booking)\r\n      if (!this.settings.bookingRules.allowConcurrentBookings) {\r\n        const conflicts = this.findBookingConflicts(newRinkId, newDate, newStart, newEnd, bookingId);\r\n        if (conflicts.length > 0) {\r\n          throw new BookingConflictError('Modified booking conflicts with existing reservation', conflicts[0]);\r\n        }\r\n      }\r\n\r\n      // If rink changed, validate the new green\r\n      if (updates.rinkId && updates.rinkId !== booking.rinkId) {\r\n        const green = this._findGreenByRinkId(updates.rinkId);\r\n        if (!green) {\r\n          throw new ValidationError('New rink not found in any green', 'rinkId', updates.rinkId);\r\n        }\r\n\r\n        green.validateBooking(\r\n          updates.rinkId,\r\n          updates.bookingTypeId || booking.bookingTypeId,\r\n          newDate,\r\n          newStart,\r\n          newEnd,\r\n          this.bookings,\r\n          bookingId\r\n        );\r\n      }\r\n    }\r\n\r\n    // Apply updates\r\n    booking.update(updates, memberId);\r\n\r\n    // Add audit log entry\r\n    this._addAuditEntry(AuditLogEntry.updateEntry('booking', bookingId, memberId, oldValues, JSON.parse(booking.toJSON())));\r\n\r\n    return booking;\r\n  }\r\n\r\n  /**\r\n   * Cancel an existing booking\r\n   * @param {string} bookingId - Booking ID to cancel\r\n   * @param {string} memberId - Member canceling the booking\r\n   * @returns {Booking} Cancelled booking instance\r\n   */\r\n  cancelBooking(bookingId, memberId) {\r\n    validateMember(memberId, 'cancel_booking');\r\n\r\n    const booking = this.bookings.find(b => b._id === bookingId);\r\n    if (!booking) {\r\n      throw new ValidationError('Booking not found', 'bookingId', bookingId);\r\n    }\r\n\r\n    if (!booking.canCancel()) {\r\n      throw new ValidationError('Booking cannot be cancelled', 'status', booking.status);\r\n    }\r\n\r\n    const oldStatus = booking.status;\r\n    booking.updateStatus('cancelled', memberId);\r\n\r\n    // Add audit log entry\r\n    this._addAuditEntry(AuditLogEntry.updateEntry(\r\n      'booking', \r\n      bookingId, \r\n      memberId, \r\n      { status: oldStatus }, \r\n      { status: 'cancelled' }\r\n    ));\r\n\r\n    return booking;\r\n  }\r\n\r\n  /**\r\n   * Get available time slots for a rink\r\n   * @param {string} rinkId - Rink ID\r\n   * @param {Date} date - Date to check\r\n   * @param {number} duration - Duration in minutes\r\n   * @returns {Array} Available time slots\r\n   */\r\n  getAvailability(rinkId, date, duration = 60) {\r\n    if (!rinkId || !date) {\r\n      return [];\r\n    }\r\n\r\n    const green = this._findGreenByRinkId(rinkId);\r\n    if (!green) {\r\n      return [];\r\n    }\r\n\r\n    const rink = green.getRink(rinkId);\r\n    if (!rink) {\r\n      return [];\r\n    }\r\n\r\n    // Get bookings for this rink and date\r\n    const dayBookings = this.bookings.filter(booking =>\r\n      booking.rinkId === rinkId &&\r\n      booking.date.toDateString() === date.toDateString() &&\r\n      booking.status !== 'cancelled'\r\n    );\r\n\r\n    // Generate potential time slots (e.g., hourly from 8 AM to 6 PM)\r\n    const availableSlots = [];\r\n    const startHour = 8;\r\n    const endHour = 18;\r\n\r\n    for (let hour = startHour; hour < endHour; hour++) {\r\n      const slotStart = new Date(date);\r\n      slotStart.setHours(hour, 0, 0, 0);\r\n      \r\n      const slotEnd = new Date(slotStart);\r\n      slotEnd.setMinutes(slotEnd.getMinutes() + duration);\r\n\r\n      // Check if this slot is available\r\n      if (isTimeSlotAvailable(slotStart, slotEnd, dayBookings)) {\r\n        availableSlots.push({\r\n          start: slotStart,\r\n          end: slotEnd,\r\n          duration: duration\r\n        });\r\n      }\r\n    }\r\n\r\n    return availableSlots;\r\n  }\r\n\r\n  /**\r\n   * Get bookings for a specific rink within a date range\r\n   * @param {string} rinkId - Rink ID\r\n   * @param {Object} dateRange - Date range with start and end\r\n   * @returns {Array} Filtered bookings\r\n   */\r\n  getRinkBookings(rinkId, dateRange = null) {\r\n    let rinkBookings = this.bookings.filter(booking => booking.rinkId === rinkId);\r\n\r\n    if (dateRange && dateRange.start && dateRange.end) {\r\n      rinkBookings = rinkBookings.filter(booking => {\r\n        const bookingDate = new Date(booking.date);\r\n        return bookingDate >= dateRange.start && bookingDate <= dateRange.end;\r\n      });\r\n    }\r\n\r\n    return rinkBookings.sort((a, b) => a.start - b.start);\r\n  }\r\n\r\n  /**\r\n   * Get all bookings for a member (using GUID)\r\n   * @param {string} memberId - Member GUID\r\n   * @param {Object} dateRange - Optional date range\r\n   * @returns {Array} Member's bookings\r\n   */\r\n  getMemberBookings(memberId, dateRange = null) {\r\n    validateMember(memberId);\r\n\r\n    let memberBookings = this.bookings.filter(booking => booking.memberId === memberId);\r\n\r\n    if (dateRange && dateRange.start && dateRange.end) {\r\n      memberBookings = memberBookings.filter(booking => {\r\n        const bookingDate = new Date(booking.date);\r\n        return bookingDate >= dateRange.start && bookingDate <= dateRange.end;\r\n      });\r\n    }\r\n\r\n    return memberBookings.sort((a, b) => a.start - b.start);\r\n  }\r\n\r\n  /**\r\n   * Get member's booking history within a date range\r\n   * @param {string} memberId - Member GUID\r\n   * @param {Object} dateRange - Date range with start and end\r\n   * @returns {Array} Member's booking history\r\n   */\r\n  getMemberBookingHistory(memberId, dateRange) {\r\n    validateMember(memberId);\r\n\r\n    if (!dateRange || !dateRange.start || !dateRange.end) {\r\n      throw new ValidationError('Date range with start and end is required');\r\n    }\r\n\r\n    return this.getMemberBookings(memberId, dateRange);\r\n  }\r\n\r\n  /**\r\n   * Get member's booking preferences\r\n   * @param {string} memberId - Member GUID\r\n   * @returns {Object|null} Member's preferences or null\r\n   */\r\n  getMemberPreferences(memberId) {\r\n    validateMember(memberId);\r\n    const member = this.members.find(m => m._id === memberId);\r\n    return member ? member.preferences : null;\r\n  }\r\n\r\n  /**\r\n   * Set member's booking preferences\r\n   * @param {string} memberId - Member GUID\r\n   * @param {Object} preferences - Preferences to set\r\n   * @returns {BookingSystem} This instance for chaining\r\n   */\r\n  setMemberPreferences(memberId, preferences) {\r\n    validateMember(memberId);\r\n\r\n    if (!preferences || typeof preferences !== 'object') {\r\n      throw new ValidationError('Valid preferences object is required', 'preferences', preferences);\r\n    }\r\n\r\n    const member = this.members.find(m => m._id === memberId);\r\n    if (member) {\r\n      member.preferences = { ...preferences };\r\n    } else {\r\n      // If member doesn't exist, create a new member with minimal data\r\n      this.members.push({\r\n        _id: memberId,\r\n        name: '', // Empty name as it should be provided by host environment\r\n        preferences: { ...preferences }\r\n      });\r\n    }\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Get system-wide booking statistics\r\n   * @param {Object} dateRange - Optional date range\r\n   * @returns {Object} System statistics\r\n   */\r\n  getSystemStats(dateRange = null) {\r\n    let bookingsToAnalyze = this.bookings;\r\n\r\n    if (dateRange && dateRange.start && dateRange.end) {\r\n      bookingsToAnalyze = bookingsToAnalyze.filter(booking => {\r\n        const bookingDate = new Date(booking.date);\r\n        return bookingDate >= dateRange.start && bookingDate <= dateRange.end;\r\n      });\r\n    }\r\n\r\n    const confirmedBookings = bookingsToAnalyze.filter(b => b.status === 'confirmed' || b.status === 'completed');\r\n    const totalMinutes = confirmedBookings.reduce((sum, booking) => sum + booking.getDuration(), 0);\r\n\r\n    const greenStats = this.greens.map(green => {\r\n      if (dateRange) {\r\n        return green.getUtilizationStats(this.bookings, dateRange.start, dateRange.end);\r\n      }\r\n      // For no date range, use last 30 days\r\n      const end = new Date();\r\n      const start = new Date();\r\n      start.setDate(start.getDate() - 30);\r\n      return green.getUtilizationStats(this.bookings, start, end);\r\n    });\r\n\r\n    return {\r\n      totalGreens: this.greens.length,\r\n      totalRinks: this.greens.reduce((sum, green) => sum + green.rinks.length, 0),\r\n      totalBookings: bookingsToAnalyze.length,\r\n      confirmedBookings: confirmedBookings.length,\r\n      totalBookedMinutes: totalMinutes,\r\n      averageBookingDuration: confirmedBookings.length > 0 ? totalMinutes / confirmedBookings.length : 0,\r\n      greenStats,\r\n      bookingsByStatus: {\r\n        pending: bookingsToAnalyze.filter(b => b.status === 'pending').length,\r\n        confirmed: bookingsToAnalyze.filter(b => b.status === 'confirmed').length,\r\n        cancelled: bookingsToAnalyze.filter(b => b.status === 'cancelled').length,\r\n        completed: bookingsToAnalyze.filter(b => b.status === 'completed').length\r\n      }\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Remove bookings older than cutoff date\r\n   * @param {Date} cutoffDate - Date before which bookings should be removed\r\n   * @param {string} memberId - Member performing the cleanup\r\n   * @returns {number} Number of bookings removed\r\n   */\r\n  clearOldBookings(cutoffDate, memberId) {\r\n    validateMember(memberId, 'cleanup_bookings');\r\n\r\n    if (!cutoffDate || !(cutoffDate instanceof Date)) {\r\n      throw new ValidationError('Valid cutoff date is required', 'cutoffDate', cutoffDate);\r\n    }\r\n\r\n    const initialCount = this.bookings.length;\r\n    this.bookings = this.bookings.filter(booking => {\r\n      const bookingDate = new Date(booking.date);\r\n      return bookingDate >= cutoffDate;\r\n    });\r\n\r\n    const removedCount = initialCount - this.bookings.length;\r\n\r\n    if (removedCount > 0) {\r\n      // Add audit log entry\r\n      this._addAuditEntry(AuditLogEntry.createEntry(\r\n        'system',\r\n        'cleanup',\r\n        memberId,\r\n        { action: 'clearOldBookings', removedCount, cutoffDate: cutoffDate.toISOString() }\r\n      ));\r\n    }\r\n\r\n    return removedCount;\r\n  }\r\n\r\n  /**\r\n   * Get audit log entries with filtering options\r\n   * @param {Object} options - Filtering options\r\n   * @returns {Array} Filtered audit log entries\r\n   */\r\n  getAuditLog(options = {}) {\r\n    let filteredLog = [...this.auditLog];\r\n\r\n    if (options.start && options.end) {\r\n      filteredLog = filteredLog.filter(entry =>\r\n        entry.withinDateRange(options.start, options.end)\r\n      );\r\n    }\r\n\r\n    if (options.memberId) {\r\n      filteredLog = filteredLog.filter(entry => entry.madeBy(options.memberId));\r\n    }\r\n\r\n    if (options.entityType) {\r\n      filteredLog = filteredLog.filter(entry => entry.entityType === options.entityType);\r\n    }\r\n\r\n    if (options.action) {\r\n      filteredLog = filteredLog.filter(entry => entry.action === options.action);\r\n    }\r\n\r\n    return filteredLog.sort((a, b) => b.timestamp - a.timestamp); // Most recent first\r\n  }\r\n\r\n  /**\r\n   * Remove audit log entries older than cutoff date\r\n   * @param {Date} cutoffDate - Date before which entries should be removed\r\n   * @param {string} memberId - Member performing the cleanup\r\n   * @returns {number} Number of entries removed\r\n   */\r\n  purgeAuditLog(cutoffDate, memberId) {\r\n    validateMember(memberId, 'purge_audit_log');\r\n\r\n    if (!cutoffDate || !(cutoffDate instanceof Date)) {\r\n      throw new ValidationError('Valid cutoff date is required', 'cutoffDate', cutoffDate);\r\n    }\r\n\r\n    const initialCount = this.auditLog.length;\r\n    this.auditLog = this.auditLog.filter(entry => entry.timestamp >= cutoffDate);\r\n    const removedCount = initialCount - this.auditLog.length;\r\n\r\n    if (removedCount > 0) {\r\n      // Add audit log entry for the purge itself\r\n      this._addAuditEntry(AuditLogEntry.createEntry(\r\n        'system',\r\n        'audit-purge',\r\n        memberId,\r\n        { action: 'purgeAuditLog', removedCount, cutoffDate: cutoffDate.toISOString() }\r\n      ));\r\n    }\r\n\r\n    return removedCount;\r\n  }\r\n\r\n  /**\r\n   * Perform full system cleanup based on retention settings\r\n   * @param {string} memberId - Member performing the cleanup\r\n   * @returns {Object} Cleanup summary\r\n   */\r\n  cleanupSystem(memberId) {\r\n    validateMember(memberId, 'system_cleanup');\r\n\r\n    const now = new Date();\r\n    \r\n    // Check if cleanup is needed\r\n    const daysSinceLastCleanup = (now - this._lastCleanup) / (1000 * 60 * 60 * 24);\r\n    if (!this.settings.dataRetention.autoCleanupEnabled || \r\n        daysSinceLastCleanup < this.settings.dataRetention.cleanupIntervalDays) {\r\n      return {\r\n        performed: false,\r\n        reason: 'Cleanup not needed yet',\r\n        daysSinceLastCleanup: Math.floor(daysSinceLastCleanup)\r\n      };\r\n    }\r\n\r\n    const bookingCutoff = new Date();\r\n    bookingCutoff.setDate(bookingCutoff.getDate() - this.settings.dataRetention.bookingRetentionDays);\r\n\r\n    const auditCutoff = new Date();\r\n    auditCutoff.setDate(auditCutoff.getDate() - this.settings.dataRetention.auditLogRetentionDays);\r\n\r\n    const removedBookings = this.clearOldBookings(bookingCutoff, memberId);\r\n    const removedAuditEntries = this.purgeAuditLog(auditCutoff, memberId);\r\n\r\n    this._lastCleanup = now;\r\n\r\n    return {\r\n      performed: true,\r\n      removedBookings,\r\n      removedAuditEntries,\r\n      bookingCutoff: bookingCutoff.toISOString(),\r\n      auditCutoff: auditCutoff.toISOString()\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Convert to JSON string for persistence\r\n   * @returns {string} JSON string representation\r\n   */\r\n  toJSON() {\r\n    const data = {\r\n      _id: this._id,\r\n      club: this.club,\r\n      settings: this.settings,\r\n      greens: this.greens.map(green => JSON.parse(green.toJSON())),\r\n      bookings: this.bookings.map(booking => JSON.parse(booking.toJSON())),\r\n      bookingTypes: this.bookingTypes.map(type => JSON.parse(type.toJSON())),\r\n      members: this.members.map(member => ({ ...member })),\r\n      timeSlots: this.timeSlots.map(slot => JSON.parse(slot.toJSON())),\r\n      auditLog: this.auditLog.map(entry => JSON.parse(entry.toJSON())),\r\n      _lastCleanup: this._lastCleanup.toISOString()\r\n    };\r\n    return JSON.stringify(data);\r\n  }\r\n\r\n  /**\r\n   * Create BookingSystem instance from JSON string\r\n   * @param {string} jsonString - JSON string data\r\n   * @returns {BookingSystem} New BookingSystem instance\r\n   */\r\n  static fromJSON(jsonString) {\r\n    if (!jsonString || typeof jsonString !== 'string') {\r\n      throw new ValidationError('Valid JSON string is required');\r\n    }\r\n\r\n    let jsonData;\r\n    try {\r\n      jsonData = JSON.parse(jsonString);\r\n    } catch (error) {\r\n      throw new ValidationError('Invalid JSON string format');\r\n    }\r\n\r\n    return new BookingSystem(jsonData);\r\n  }\r\n\r\n    /**\r\n   * Create enhanced booking object with resolved references for display purposes\r\n   * @param {string} bookingId - The booking ID to enhance\r\n   * @param {string} [currentMemberId] - Current member ID for permission calculations\r\n   * @returns {Object|null} Enhanced booking object with resolved data, or null if booking not found\r\n   * @throws {ValidationError} When bookingId is invalid\r\n   */\r\n  createDisplayBooking(bookingId, currentMemberId = null) {\r\n    if (!bookingId || typeof bookingId !== 'string') {\r\n      throw new ValidationError('Valid booking ID is required', 'bookingId', bookingId);\r\n    }\r\n\r\n    // Find the base booking\r\n    const booking = this.bookings.find(b => b._id === bookingId);\r\n    if (!booking) {\r\n      return null;\r\n    }\r\n\r\n    // Resolve green and rink\r\n    const green = this._findGreenByRinkId(booking.rinkId);\r\n    const rink = green?.getRink(booking.rinkId) || null;\r\n\r\n    // Resolve participants\r\n    const participantObjects = booking.participants.map(memberId => {\r\n      const member = this.members.find(m => m._id === memberId);\r\n      return member || { \r\n        _id: memberId, \r\n        name: 'Unknown Member', \r\n        preferences: {} \r\n      };\r\n    });\r\n\r\n    // Resolve booking type\r\n    const bookingType = this.bookingTypes.find(bt => bt._id === booking.bookingTypeId) || null;\r\n\r\n    // Get conflicts\r\n    const conflicts = this.findBookingConflicts(\r\n      booking.rinkId, \r\n      booking.date, \r\n      booking.start, \r\n      booking.end, \r\n      booking._id\r\n    );\r\n\r\n    // Create enhanced booking object with computed properties\r\n    return {\r\n      // Spread all original booking properties\r\n      ...booking,\r\n\r\n      // Add resolved references\r\n      green,\r\n      rink,\r\n      participantObjects,\r\n      bookingType,\r\n\r\n      // Add computed display properties\r\n      get displayName() {\r\n        return green && rink ? `${green.name} - Rink ${rink.number}` : 'Unknown Location';\r\n      },\r\n\r\n      get formattedDate() {\r\n        return booking.date.toLocaleDateString('en-GB', { \r\n          year: 'numeric', \r\n          month: 'long', \r\n          day: 'numeric' \r\n        });\r\n      },\r\n  \r\n      get formattedStartTime() {\r\n        return booking.start.toLocaleTimeString('en-GB', { \r\n          hour: '2-digit', \r\n          minute: '2-digit',\r\n          hour12: false \r\n        });\r\n      },\r\n  \r\n      get formattedEndTime() {\r\n        return booking.end.toLocaleTimeString('en-GB', { \r\n          hour: '2-digit', \r\n          minute: '2-digit',\r\n          hour12: false \r\n        });\r\n      },\r\n      \r\n      get durationText() {\r\n        const duration = calculateDuration(booking.start, booking.end);\r\n        const hours = Math.floor(duration / 60);\r\n        const minutes = duration % 60;\r\n        \r\n        if (hours === 0) {\r\n          return `${minutes} minute${minutes !== 1 ? 's' : ''}`;\r\n        } else if (minutes === 0) {\r\n          return `${hours} hour${hours !== 1 ? 's' : ''}`;\r\n        } else {\r\n          return `${hours}h ${minutes}m`;\r\n        }\r\n      },\r\n\r\n      get canEdit() {\r\n        return currentMemberId === booking.memberId && booking.canModify();\r\n      },\r\n\r\n      get canCancel() {\r\n        return currentMemberId === booking.memberId && booking.canCancel();\r\n      },\r\n\r\n      get conflicts() {\r\n        if (conflicts.length === 0) {\r\n          return { type: 'none', severity: 'none' };\r\n        }\r\n\r\n        return {\r\n          type: 'time',\r\n          conflictingBookings: conflicts,\r\n          severity: 'error'\r\n        };\r\n      }\r\n    };\r\n  }\r\n\r\n  // Private helper methods\r\n\r\n  /**\r\n   * Find green that contains the specified rink\r\n   * @private\r\n   */\r\n  _findGreenByRinkId(rinkId) {\r\n    return this.greens.find(green => green.getRink(rinkId) !== null);\r\n  }\r\n\r\n  /**\r\n   * Validate booking rules\r\n   * @private\r\n   */\r\n  _validateBookingRules(bookingData) {\r\n    const rules = this.settings.bookingRules;\r\n    const now = new Date();\r\n    \r\n    // Check advance booking limit\r\n    const daysInAdvance = (bookingData.date - now) / (1000 * 60 * 60 * 24);\r\n    if (daysInAdvance > rules.maxAdvanceBookingDays) {\r\n      throw new ValidationError(\r\n        `Cannot book more than ${rules.maxAdvanceBookingDays} days in advance`,\r\n        'advanceBooking',\r\n        daysInAdvance\r\n      );\r\n    }\r\n\r\n    // Check minimum advance booking time\r\n    const hoursInAdvance = (bookingData.start - now) / (1000 * 60 * 60);\r\n    if (hoursInAdvance < rules.minAdvanceBookingHours) {\r\n      throw new ValidationError(\r\n        `Must book at least ${rules.minAdvanceBookingHours} hours in advance`,\r\n        'minAdvanceBooking',\r\n        hoursInAdvance\r\n      );\r\n    }\r\n\r\n    // Check booking duration\r\n    const duration = calculateDuration(bookingData.start, bookingData.end);\r\n    if (duration < rules.minBookingDuration) {\r\n      throw new ValidationError(\r\n        `Booking duration must be at least ${rules.minBookingDuration} minutes`,\r\n        'minDuration',\r\n        duration\r\n      );\r\n    }\r\n\r\n    if (duration > rules.maxBookingDuration) {\r\n      throw new ValidationError(\r\n        `Booking duration cannot exceed ${rules.maxBookingDuration} minutes`,\r\n        'maxDuration',\r\n        duration\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Find booking conflicts for a given rink, date, and time range.\r\n   *\r\n   * @param {string} rinkId - The ID of the rink to check for conflicts.\r\n   * @param {Date} date - The date of the booking to check.\r\n   * @param {Date} start - The start time of the booking.\r\n   * @param {Date} end - The end time of the booking.\r\n   * @param {string|null} [excludeBookingId=null] - Optional booking ID to exclude from conflict check (e.g., when modifying an existing booking).\r\n   * @returns {Array} Array of conflicting Booking instances.\r\n   */\r\n  findBookingConflicts(rinkId, date, start, end, excludeBookingId = null) {\r\n    return this.bookings.filter(booking => {\r\n      if (booking._id === excludeBookingId) return false;\r\n      if (booking.status === 'cancelled') return false;\r\n      if (booking.rinkId !== rinkId) return false;\r\n      if (booking.date.toDateString() !== date.toDateString()) return false;\r\n\r\n      // Check time overlap\r\n      return booking.start < end && booking.end > start;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Add audit log entry\r\n   * @private\r\n   */\r\n  _addAuditEntry(auditEntry) {\r\n    this.auditLog.push(auditEntry);\r\n  }\r\n} "],"names":["BookingJSError","Error","constructor","message","code","name","captureStackTrace","BookingConflictError","conflictingBooking","InvalidTimeSlotError","MemberPermissionError","memberId","ValidationError","field","value","BookingTypeNotAllowedError","bookingTypeId","location","validateBooking","bookingData","rinkId","date","start","Date","end","validStatuses","status","includes","validateTimeSlot","timeSlot","validateMember","action","validateColor","color","fieldName","colorRegex","test","calculateDuration","Math","round","isTimeSlotAvailable","existingBookings","excludeBookingId","booking","_id","bookingStart","bookingEnd","formatDateTime","options","defaults","year","month","day","hour","minute","hour12","formatOptions","toLocaleString","timePeriodsOverlap","start1","end1","start2","end2","getNextAvailableSlot","afterTime","duration","workingHours","proposedStart","proposedEnd","getTime","startHour","getHours","endHour","nextDay","setDate","getDate","setHours","futureBookings","filter","sort","a","b","length","nextSlot","Rink","data","number","uuidv4","allowedBookingTypes","Array","isArray","update","updates","allowedFields","updateKeys","Object","keys","key","undefined","isAvailable","rinkBookings","toDateString","addAllowedBookingType","push","removeAllowedBookingType","index","indexOf","splice","isBookingTypeAllowed","getBookings","allBookings","startDate","endDate","bookingDate","getUtilizationStats","totalMinutes","reduce","sum","totalDays","ceil","totalAvailableMinutes","rinkNumber","totalBookings","totalBookedMinutes","utilizationPercentage","averageBookingDuration","toJSON","JSON","stringify","fromJSON","jsonString","jsonData","parse","error","Green","trim","facilities","rinks","rinkData","addRink","rink","rinkInstance","existingRink","find","r","removeRink","findIndex","getRink","getRinkByNumber","getAvailableRinks","addFacility","facility","facilityName","removeFacility","rinkIds","map","greenBookings","rinkStats","greenId","greenName","totalRinks","Booking","participants","notes","createdDate","updatedDate","unshift","bookingDay","startDay","endDay","updateStatus","newStatus","validTransitions","pending","confirmed","cancelled","completed","from","to","addParticipant","removeParticipant","getDuration","isActive","now","isPast","isFuture","canModify","canCancel","newDate","newStart","newEnd","getBookingType","bookingTypes","type","overlapsWith","otherBooking","toISOString","split","BookingType","backgroundColor","foregroundColor","description","priority","getDefaults","AuditLogEntry","entityType","entityId","validActions","join","validEntityTypes","timestamp","oldValues","newValues","metadata","isNaN","getDescription","actionMap","create","delete","cancel","actionText","relatesTo","madeBy","withinDateRange","getChangedFields","changedFields","allKeys","Set","oldValue","newValue","createEntry","values","updateEntry","deleteEntry","TimeSlot","isRecurring","Boolean","recurringPattern","validPatterns","isWithinSlot","time","overlaps","generateRecurringInstances","fromDate","toDate","instances","currentDate","slotStart","getMinutes","slotEnd","setMinutes","setMonth","getMonth","setFullYear","getFullYear","DEFAULT_SETTINGS","bookingRules","maxAdvanceBookingDays","minAdvanceBookingHours","maxBookingDuration","minBookingDuration","allowConcurrentBookings","requireApproval","dataRetention","bookingRetentionDays","auditLogRetentionDays","autoCleanupEnabled","cleanupIntervalDays","notifications","sendConfirmationEmail","sendReminderEmail","reminderHours","BookingSystem","club","settings","greens","bookings","timeSlots","auditLog","members","member","preferences","greenData","addGreen","bookingTypeData","addBookingType","defaultType","timeSlotData","auditData","_lastCleanup","green","greenInstance","existingGreen","g","removeGreen","getRinkBookings","_addAuditEntry","bookingType","bookingTypeInstance","existingType","t","removeBookingType","typeBookings","createBooking","_validateBookingRules","_findGreenByRinkId","conflicts","findBookingConflicts","modifyBooking","bookingId","newRinkId","cancelBooking","oldStatus","getAvailability","dayBookings","availableSlots","dateRange","getMemberBookings","memberBookings","getMemberBookingHistory","getMemberPreferences","m","setMemberPreferences","getSystemStats","bookingsToAnalyze","confirmedBookings","greenStats","totalGreens","bookingsByStatus","clearOldBookings","cutoffDate","initialCount","removedCount","getAuditLog","filteredLog","entry","purgeAuditLog","cleanupSystem","daysSinceLastCleanup","performed","reason","floor","bookingCutoff","auditCutoff","removedBookings","removedAuditEntries","slot","createDisplayBooking","currentMemberId","participantObjects","bt","displayName","formattedDate","toLocaleDateString","formattedStartTime","toLocaleTimeString","formattedEndTime","durationText","hours","minutes","canEdit","severity","conflictingBookings","rules","daysInAdvance","hoursInAdvance","auditEntry"],"mappings":"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"}