'use strict'

const createParseMovement = (profile, locations, lines, remarks) => {
	// todo: what is m.dirGeo? maybe the speed?
	// todo: what is m.stopL?
	// todo: what is m.proc? wut?
	// todo: what is m.pos?
	// todo: what is m.ani.dirGeo[n]? maybe the speed?
	// todo: what is m.ani.proc[n]? wut?
	// todo: how does m.ani.poly work?
	const parseMovement = (m) => {
		const parseNextStop = (s) => {
			const dep = s.dTimeR || s.dTimeS
				? profile.parseDateTime(profile, m.date, s.dTimeR || s.dTimeS)
				: null
			const arr = s.aTimeR || s.aTimeS
				? profile.parseDateTime(profile, m.date, s.aTimeR || s.aTimeS)
				: null

			const res = {
				station: locations[s.locX],
				departure: dep ? dep.toISO() : null,
				arrival: arr ? arr.toISO() : null
			}

			if (m.dTimeR && m.dTimeS) {
				const plannedDep = profile.parseDateTime(profile, m.date, s.dTimeS)
				res.departureDelay = Math.round((dep - plannedDep) / 1000)
			} else res.departureDelay = null

			if (m.aTimeR && m.aTimeS) {
				const plannedArr = profile.parseDateTime(profile, m.date, s.aTimeS)
				res.arrivalDelay = Math.round((arr - plannedArr) / 1000)
			} else res.arrivalDelay = null

			return res
		}

		const res = {
			direction: profile.parseStationName(m.dirTxt),
			trip: m.jid && +m.jid.split('|')[1] || null, // todo: this seems brittle
			line: lines[m.prodX] || null,
			location: m.pos ? {
				type: 'location',
				latitude: m.pos.y / 1000000,
				longitude: m.pos.x / 1000000
			} : null,
			nextStops: m.stopL.map(parseNextStop),
			frames: []
		}

		if (m.ani && Array.isArray(m.ani.mSec)) {
			for (let i = 0; i < m.ani.mSec.length; i++) {
				res.frames.push({
					origin: locations[m.ani.fLocX[i]] || null,
					destination: locations[m.ani.tLocX[i]] || null,
					t: m.ani.mSec[i]
				})
			}
		}

		return res
	}
	return parseMovement
}

module.exports = createParseMovement