'use strict'

const findById = (needle) => {
	const needleStopId = needle.id
	const needleStationId = needle.station ? needle.station.id : null

	return (stop) => {
		if (needleStopId === stop.id) return true
		const stationId = stop.station ? stop.station.id : null
		if (needleStationId && stationId && needleStationId === stationId) return true
		// todo: `needleStationId === stop.id`? `needleStopId === stationId`?
		return false
	}
}

const sliceLeg = (leg, from, to) => {
	if (!Array.isArray(leg.stopovers)) throw new Error('leg.stopovers must be an array.')

	const stops = leg.stopovers.map(st => st.stop)
	const fromI = stops.findIndex(findById(from))
	if (fromI === -1) throw new Error('from not found in stopovers')
	const fromStopover = leg.stopovers[fromI]

	const toI = stops.findIndex(findById(to))
	if (toI === -1) throw new Error('to not found in stopovers')
	const toStopover = leg.stopovers[toI]

	if (fromI === 0 && toI === leg.stopovers.length - 1) return leg
	const newLeg = Object.assign({}, leg)
	newLeg.stopovers = leg.stopovers.slice(fromI, toI + 1)

	newLeg.origin = fromStopover.stop
	newLeg.departure = fromStopover.departure
	newLeg.departureDelay = fromStopover.departureDelay
	newLeg.scheduledDeparture = fromStopover.scheduledDeparture
	newLeg.departurePlatform = fromStopover.departurePlatform

	newLeg.destination = toStopover.stop
	newLeg.arrival = toStopover.arrival
	newLeg.arrivalDelay = toStopover.arrivalDelay
	newLeg.scheduledArrival = toStopover.scheduledArrival
	newLeg.arrivalPlatform = toStopover.arrivalPlatform

	return newLeg
}

module.exports = sliceLeg