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

// Check if we're serving orders first-come, first-served

// recursive solution
function isFirstComeFirstServed(takeOut, dineIn, served) {
	if (served.length === 0) return true

	if (takeOut.length && takeOut[0] === served[0]) {
		return isFirstComeFirstServed(takeOut.slice(1), dineIn, served.slice(1))
	}

	if (dineIn.length && dineIn[0] === served[0]) {
		return isFirstComeFirstServed(takeOut, dineIn.slice(1), served.slice(1))
	}
	return false
}

/*
Time Complexity - O(n^2)
Space complexity - O(n^2)
*/

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

// Using pointers
function isFirstComeFirstServedIterative(takeOut, dineIn, served) {
	const takeOutLen = takeOut.length,
		dineInLen = dineIn.length

	let t = 0,
		d = 0

	for (const order of served) {
		// increment takeOut index if order matches take out order
		if (t < takeOutLen && order === takeOut[t]) t++
		// increment dineIn index if order matches dine in order
		else if (d < dineInLen && order === dineIn[d]) d++
		// if neither one matches, the order cut in line OR the order doesn't exist, so return false
		else return false
	}
	/*  check if total no. of take out and dine in orders matches the number of served orders.
	 If either t or d don't match the total no of take our or dine in order respectively,
	 that order was never served. Someone din't get cake. So sad :( */
	if (t !== takeOutLen || d !== dineInLen) return false

	return true
}

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

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

const testCases = [
	[[1, 4, 5], [2, 3, 6], [1, 2, 3, 4, 5, 6], true],
	[[1, 5], [2, 3, 6], [1, 2, 6, 3, 5], false],
	[[], [2, 3, 6], [2, 3, 6], true],
	[[1, 5], [2, 3, 6], [1, 2, 3, 5, 6, 8], false],
	[[27, 12, 18], [55, 31, 8], [55, 31, 8, 27, 12, 18], true],
]

console.log('Recursive')
for (const test of testCases) {
	console.log(isFirstComeFirstServed(test[0], test[1], test[2]) === test[3])
}

console.log('Iterative')
for (const test of testCases) {
	console.log(
		isFirstComeFirstServedIterative(test[0], test[1], test[2]) === test[3]
	)
}