const types = {
	locale: 'string',
	timezone: 'string',

	request: 'function',
	transformReq: 'function',
	transformReqBody: 'function',

	formatStationBoardReq: 'function',
	formatLocationsReq: 'function',
	formatStopReq: 'function',
	formatTripReq: 'function',
	formatRefreshJourneyReq: 'function',
	formatJourneysReq: 'function',
	transformJourneysQuery: 'function',

	products: 'array',

	parseDateTime: 'function',
	parseDeparture: 'function',
	parseArrival: 'function',
	parseJourneyLeg: 'function',
	parseJourney: 'function',
	parseLine: 'function',
	parseStationName: 'function',
	parseLocation: 'function',
	parsePolyline: 'function',
	parseOperator: 'function',
	parseRemarks: 'function',
	parseStopover: 'function',

	formatAddress: 'function',
	formatCoord: 'function',
	formatDate: 'function',
	formatLocationFilter: 'function',
	formatProductsFilter: 'function',
	formatPoi: 'function',
	formatStation: 'function',
	formatTime: 'function',
	formatLocation: 'function',
	formatRectangle: 'function',
};

const validateProfile = (profile) => {
	for (let key of Object.keys(types)) {
		const type = types[key];
		if (type === 'array') {
			if (!Array.isArray(profile[key])) {
				throw new TypeError(`profile.${key} must be an array.`);
			}
		} else if (type !== typeof profile[key]) {
			throw new TypeError(`profile.${key} must be a ${type}.`);
		}
		if (type === 'object' && profile[key] === null) {
			throw new TypeError(`profile.${key} must not be null.`);
		}
	}

	if (!Array.isArray(profile.products)) {
		throw new TypeError('profile.products must be an array.');
	}
	if (profile.products.length === 0) {
		throw new Error('profile.products is empty.');
	}
	for (let product of profile.products) {
		if ('string' !== typeof product.id) {
			throw new TypeError('profile.products[].id must be a string.');
		}
		if ('boolean' !== typeof product.default) {
			throw new TypeError('profile.products[].default must be a boolean.');
		}
		if (!Array.isArray(product.bitmasks)) {
			throw new TypeError(product.id + '.bitmasks must be an array.');
		}
		for (let bitmask of product.bitmasks) {
			if ('number' !== typeof bitmask) {
				throw new TypeError(product.id + '.bitmasks[] must be a number.');
			}
		}
	}

	if ('trip' in profile && 'boolean' !== typeof profile.trip) {
		throw new Error('profile.trip must be a boolean.');
	}
	if ('journeyLeg' in profile) {
		throw new Error('profile.journeyLeg has been removed. Use profile.trip.');
	}
};

export {
	validateProfile,
};