const testEarlierLaterJourneys = async (cfg) => {
	const {
		test: t,
		fetchJourneys,
		fromId,
		toId,
		when,
		// todo: validate
	} = cfg;

	const model = await fetchJourneys(fromId, toId, {
		results: 3, departure: when,
	});

	// todo: move to journeys validator?
	t.equal(typeof model.earlierRef, 'string');
	t.ok(model.earlierRef);
	t.equal(typeof model.laterRef, 'string');
	t.ok(model.laterRef);

	// departure/arrival and earlierThan/laterThan should be mutually exclusive
	await t.rejects(async () => {
		await fetchJourneys(fromId, toId, {
			departure: when, earlierThan: model.earlierRef,
		});
	});
	await t.rejects(async () => {
		await fetchJourneys(fromId, toId, {
			departure: when, laterThan: model.laterRef,
		});
	});
	await t.rejects(async () => {
		await fetchJourneys(fromId, toId, {
			arrival: when, earlierThan: model.earlierRef,
		});
	});
	await t.rejects(async () => {
		await fetchJourneys(fromId, toId, {
			arrival: when, laterThan: model.laterRef,
		});
	});

	let earliestDep = Infinity, latestDep = -Infinity;
	for (let j of model.journeys) {
		if (j.legs[0].departure === null) {
			continue;
		}
		const dep = Date.parse(j.legs[0].departure);
		if (dep < earliestDep) {
			earliestDep = dep;
		} else if (dep > latestDep) {
			latestDep = dep;
		}
	}

	const earlier = await fetchJourneys(fromId, toId, {
		results: 3,
		// todo: single journey ref?
		earlierThan: model.earlierRef,
	});
	for (let j of earlier.journeys) {
		const firstLeg = j.legs[0];
		const dep = Date.parse(firstLeg.departure || firstLeg.plannedDeparture);
		t.ok(dep < earliestDep);
	}

	const later = await fetchJourneys(fromId, toId, {
		results: 3,
		// todo: single journey ref?
		laterThan: model.laterRef,
	});
	for (let j of later.journeys) {
		const firstLeg = j.legs[0];
		const dep = Date.parse(firstLeg.departure || firstLeg.plannedDeparture);
		t.ok(dep > latestDep);
	}
};

export {
	testEarlierLaterJourneys,
};