{"version":3,"sources":["../src/conversion.ts","../src/comparison.ts"],"names":["TimezoneCache","fromZonedTime","toZonedTime","memoize","toDate"],"mappings":"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","file":"comparison.cjs","sourcesContent":["import { toZonedTime, fromZonedTime, formatInTimeZone } from \"date-fns-tz\";\nimport type { ConvertTimezoneOptions } from \"@multisystemsuite/timezone-engine-shared-types\";\nimport { memoize, TimezoneCache } from \"@multisystemsuite/timezone-engine-utils\";\n\nconst conversionCache = new TimezoneCache();\n\nfunction toDate(input: Date | string | number): Date {\n  if (input instanceof Date) return input;\n  return new Date(input);\n}\n\n/** Convert date to UTC */\nexport function toUTC(date: Date | string | number, sourceTimezone: string): Date {\n  const d = toDate(date);\n  return fromZonedTime(d, sourceTimezone);\n}\n\n/** Convert UTC date to target timezone representation */\nexport function fromUTC(date: Date | string | number, targetTimezone: string): Date {\n  const d = toDate(date);\n  return toZonedTime(d, targetTimezone);\n}\n\n/** Convert date between timezones */\nexport function convertTimezone(options: ConvertTimezoneOptions): Date {\n  const { sourceTimezone, targetTimezone, date = new Date() } = options;\n  const utcDate = toUTC(date, sourceTimezone);\n  return fromUTC(utcDate, targetTimezone);\n}\n\nconst memoizedConvert = memoize(\n  (sourceTimezone: string, targetTimezone: string, timestamp: number) =>\n    convertTimezone({ sourceTimezone, targetTimezone, date: new Date(timestamp) }),\n  (source, target, ts) => `${source}:${target}:${ts}`,\n  conversionCache,\n);\n\n/** Cached timezone conversion for high-performance scenarios */\nexport function convertTimezoneCached(\n  sourceTimezone: string,\n  targetTimezone: string,\n  date: Date | string | number = new Date(),\n): Date {\n  return memoizedConvert(sourceTimezone, targetTimezone, toDate(date).getTime());\n}\n\n/** Detect if DST is active for a timezone at a given date */\nexport function detectDST(timezone: string, date: Date | string | number = new Date()): boolean {\n  const d = toDate(date);\n  const jan = new Date(d.getFullYear(), 0, 1);\n  const jul = new Date(d.getFullYear(), 6, 1);\n\n  const janOffset = getTimezoneOffsetMinutes(timezone, jan);\n  const julOffset = getTimezoneOffsetMinutes(timezone, jul);\n  const currentOffset = getTimezoneOffsetMinutes(timezone, d);\n\n  if (janOffset === julOffset) return false;\n  return currentOffset !== Math.max(janOffset, julOffset);\n}\n\n/** Get UTC offset string for a timezone (e.g. \"+05:30\") */\nexport function getUtcOffset(timezone: string, date: Date | string | number = new Date()): string {\n  const d = toDate(date);\n  const formatted = formatInTimeZone(d, timezone, \"xxx\");\n  return formatted;\n}\n\n/** Get offset in minutes from UTC */\nexport function getTimezoneOffsetMinutes(\n  timezone: string,\n  date: Date | string | number = new Date(),\n): number {\n  const d = toDate(date);\n  const utcDate = toUTC(d, timezone);\n  return (utcDate.getTime() - d.getTime()) / 60_000;\n}\n","import type { TimezoneComparison } from \"@multisystemsuite/timezone-engine-shared-types\";\nimport { getTimezoneOffsetMinutes, toUTC } from \"./conversion.js\";\n\nfunction formatOffsetDifference(minutes: number): string {\n  const abs = Math.abs(minutes);\n  const hours = Math.floor(abs / 60);\n  const mins = abs % 60;\n  const sign = minutes >= 0 ? \"+\" : \"-\";\n  return `${sign}${String(hours).padStart(2, \"0\")}:${String(mins).padStart(2, \"0\")}`;\n}\n\n/** Compare two timezones */\nexport function compareTimezones(\n  source: string,\n  target: string,\n  date: Date | string | number = new Date(),\n): TimezoneComparison {\n  const sourceOffset = getTimezoneOffsetMinutes(source, date);\n  const targetOffset = getTimezoneOffsetMinutes(target, date);\n  const diff = targetOffset - sourceOffset;\n\n  return {\n    source,\n    target,\n    offsetDifferenceMinutes: diff,\n    offsetDifferenceLabel: formatOffsetDifference(diff),\n    sameOffset: diff === 0,\n    sourceAhead: diff < 0,\n  };\n}\n\n/** Compare multiple timezones against a reference */\nexport function compareMultipleTimezones(\n  reference: string,\n  targets: string[],\n  date: Date | string | number = new Date(),\n): TimezoneComparison[] {\n  return targets.map((target) => compareTimezones(reference, target, date));\n}\n\n/** Find best meeting time across timezones (simple overlap window) */\nexport function findCommonWorkingHours(\n  timezones: string[],\n  workStartHour = 9,\n  workEndHour = 17,\n  date: Date = new Date(),\n): { startHourUTC: number; endHourUTC: number; overlapHours: number } {\n  if (timezones.length === 0) {\n    return { startHourUTC: workStartHour, endHourUTC: workEndHour, overlapHours: 0 };\n  }\n\n  const offsets = timezones.map((tz) => getTimezoneOffsetMinutes(tz, date));\n  const minOffset = Math.min(...offsets);\n  const maxOffset = Math.max(...offsets);\n\n  const startUTC = workStartHour - maxOffset / 60;\n  const endUTC = workEndHour - minOffset / 60;\n  const overlap = Math.max(0, endUTC - startUTC);\n\n  return {\n    startHourUTC: startUTC,\n    endHourUTC: endUTC,\n    overlapHours: overlap,\n  };\n}\n\nfunction toDate(input: Date | string | number): Date {\n  if (input instanceof Date) return input;\n  return new Date(input);\n}\n\n/** Timezone-safe instant comparison — compares UTC instants, not wall-clock strings */\nexport function timezoneSafeCompare(\n  a: Date | string | number,\n  b: Date | string | number,\n  timezoneA = \"UTC\",\n  timezoneB = \"UTC\",\n): { equal: boolean; differenceMs: number; aUTC: Date; bUTC: Date } {\n  const aUTC = toUTC(toDate(a), timezoneA);\n  const bUTC = toUTC(toDate(b), timezoneB);\n  const differenceMs = aUTC.getTime() - bUTC.getTime();\n  return {\n    equal: differenceMs === 0,\n    differenceMs,\n    aUTC,\n    bUTC,\n  };\n}\n"]}