const formatJourneysReq = (ctx, from, to, when, outFrwd, journeysRef) => {
	const {profile, opt} = ctx;

	from = profile.formatLocation(profile, from, 'from');
	to = profile.formatLocation(profile, to, 'to');
	const filters = profile.formatProductsFilter({profile}, opt.products || {});
	const transfers = profile.formatTransfers(opt.transfers);
	// TODO opt.accessibility
	// TODO routingMode
	let query = {
		maxUmstiege: transfers,
		minUmstiegszeit: opt.transferTime,
		deutschlandTicketVorhanden: false,
		nurDeutschlandTicketVerbindungen: false,
		reservierungsKontingenteVorhanden: false,
		schnelleVerbindungen: true,
		sitzplatzOnly: false,
		abfahrtsHalt: from.lid,
		zwischenhalte: opt.via
			? [{id: profile.formatLocation(profile, opt.via, 'opt.via').lid}]
			: null,
		ankunftsHalt: to.lid,
		produktgattungen: filters,
		bikeCarriage: opt.bike,
		// TODO
		// todo: this is actually "take additional stations nearby the given start and destination station into account"
		// see rest.exe docs
		// ushrp: Boolean(opt.startWithWalking),
	};
	query.anfrageZeitpunkt = profile.formatTime(profile, when);
	if (journeysRef) {
		query.pagingReference = journeysRef;
	}
	query.ankunftSuche = outFrwd ? 'ABFAHRT' : 'ANKUNFT';
	if (opt.results !== null) {
		// TODO query.numF = opt.results;
	}
	query = Object.assign(query, ctx.profile.formatTravellers(ctx));
	return {
		endpoint: ctx.profile.journeysEndpoint,
		body: query,
		method: 'post',
	};
};
// TODO poly conditional other endpoint
const formatRefreshJourneyReq = (ctx, refreshToken) => {
	const {profile, opt} = ctx;
	if (opt.tickets) {
		let query = {
			ctxRecon: refreshToken,
			deutschlandTicketVorhanden: false,
			nurDeutschlandTicketVerbindungen: false,
			reservierungsKontingenteVorhanden: false,
		};
		query = Object.assign(query, profile.formatTravellers(ctx));
		return {
			endpoint: profile.refreshJourneysEndpointTickets,
			body: query,
			method: 'post',
		};
	} else {
		return {
			endpoint: profile.refreshJourneysEndpointPolyline,
			body: {
				ctxRecon: refreshToken,
				poly: true,
			},
			method: 'post',
		};
	}
};

export {
	formatJourneysReq,
	formatRefreshJourneyReq,
};