// https://www.interviewcake.com/question/javascript/merging-ranges?course=fc1§ion=array-and-string-manipulation

// Merge meetings ranges
function mergeRanges(meetings) {
	// 1. If array is empty or there is only one meeting return the meetings
	const len = meetings.length
	if (len <= 1) return meetings

	/*
  2. Deep copy array so we don't mutate it
  3. Sort the copied array */
	const meetingsCopy = JSON.parse(JSON.stringify(meetings)),
		sorted = meetingsCopy.sort((a, b) => a.startTime - b.startTime),
		mergedMeetings = []

	// 3. Initialize two variables merged and curr with merged set to the first item from sorted
	let merged = sorted[0],
		curr

	/*
  4. Check if curr.startTime <= merged.endTime and if it is true, merge curr with merged  
  5. Otherwise push the merged into mergedMeetings and set the new merged as the curr */
	for (let i = 1; i < len; i++) {
		curr = sorted[i]
		if (curr.startTime <= merged.endTime) {
			const latestEndT = Math.max(merged.endTime, curr.endTime)
			merged = { startTime: merged.startTime, endTime: latestEndT }
		} else {
			mergedMeetings.push(merged)
			merged = curr
		}
	}

	// 6. Push the last leftover meeting
	mergedMeetings.push(merged)

	return mergedMeetings
}

/*
Time Complexity - O(nlgn)
Space complexity - O(n)
*/

/* ---------------------------------------------------------------------------- */

const testCases = [
	[
		[
			{ startTime: 5, endTime: 6 },
			{ startTime: 6, endTime: 8 },
		],
		[{ startTime: 5, endTime: 8 }],
	],
	[
		[
			{ startTime: 3, endTime: 5 },
			{ startTime: 10, endTime: 12 },
			{ startTime: 9, endTime: 10 },
			{ startTime: 0, endTime: 1 },
			{ startTime: 4, endTime: 8 },
		],
		[
			{ startTime: 0, endTime: 1 },
			{ startTime: 3, endTime: 8 },
			{ startTime: 9, endTime: 12 },
		],
	],
	[
		[
			{ startTime: 1, endTime: 8 },
			{ startTime: 2, endTime: 5 },
		],
		[{ startTime: 1, endTime: 8 }],
	],
	[
		[
			{ startTime: 1, endTime: 3 },
			{ startTime: 4, endTime: 8 },
		],
		[
			{ startTime: 1, endTime: 3 },
			{ startTime: 4, endTime: 8 },
		],
	],
	[
		[
			{ startTime: 1, endTime: 4 },
			{ startTime: 2, endTime: 5 },
			{ startTime: 5, endTime: 8 },
		],
		[{ startTime: 1, endTime: 8 }],
	],
]
for (const test of testCases) {
	console.log(JSON.stringify(mergeRanges(test[0])) === JSON.stringify(test[1]))
}