import {request} from '../lib/request.js'

import {formatStationBoardReq} from '../format/station-board-req.js'
import {formatLocationsReq} from '../format/locations-req.js'
import {formatStopReq} from '../format/stop-req.js'
import {formatNearbyReq} from '../format/nearby-req.js'
import {formatTripReq} from '../format/trip-req.js'
import {formatRadarReq} from '../format/radar-req.js'
import {formatReachableFromReq} from '../format/reachable-from-req.js'
import {formatRefreshJourneyReq} from '../format/refresh-journey-req.js'
import {formatRemarksReq} from '../format/remarks-req.js'
import {formatLinesReq} from '../format/lines-req.js'

import {parseDateTime} from '../parse/date-time.js'
import {parsePlatform} from '../parse/platform.js'
import {parseBitmask as parseProductsBitmask} from '../parse/products-bitmask.js'
import {parseIcon} from '../parse/icon.js'
import {parseWhen} from '../parse/when.js'
import {parsePrognosisType} from '../parse/prognosis-type.js'
import {parseScheduledDays} from '../parse/scheduled-days.js'
import {parseDeparture} from '../parse/departure.js'
import {parseArrival} from '../parse/arrival.js'
import {parseTrip} from '../parse/trip.js'
import {parseJourneyLeg} from '../parse/journey-leg.js'
import {parseJourney} from '../parse/journey.js'
import {parseLine} from '../parse/line.js'
import {parseLocation} from '../parse/location.js'
import {parseCommonData as parseCommon} from '../parse/common.js'
import {parsePolyline} from '../parse/polyline.js'
import {parseMovement} from '../parse/movement.js'
import {parseNearby} from '../parse/nearby.js'
import {parseOperator} from '../parse/operator.js'
import {parseHint} from '../parse/hint.js'
import {parseWarning} from '../parse/warning.js'
import {parseStopover} from '../parse/stopover.js'

import {formatAddress} from '../format/address.js'
import {formatCoord} from '../format/coord.js'
import {formatDate} from '../format/date.js'
import {formatLocationFilter} from '../format/location-filter.js'
import {formatProductsFilter} from '../format/products-filter.js'
import {formatPoi} from '../format/poi.js'
import {formatStation} from '../format/station.js'
import {formatTime} from '../format/time.js'
import {formatLocation} from '../format/location.js'
import {formatRectangle} from '../format/rectangle.js'
import * as filters from '../format/filters.js'

const DEBUG = /(^|,)hafas-client(,|$)/.test(process.env.DEBUG || '')
const logRequest = DEBUG
	? (_, req, reqId) => console.error(req.body + '')
	: () => {}
const logResponse = DEBUG
	? (_, res, body, reqId) => console.error(body)
	: () => {}

const id = (ctx, x) => x

const defaultProfile = {
	request,
	transformReqBody: id,
	transformReq: id,
	salt: null,
	addChecksum: false,
	addMicMac: false,
	randomizeUserAgent: true,
	logRequest,
	logResponse,

	formatStationBoardReq,
	formatLocationsReq,
	formatStopReq,
	formatNearbyReq,
	formatTripReq,
	formatRadarReq,
	formatReachableFromReq,
	formatRefreshJourneyReq,
	formatRemarksReq,
	formatLinesReq,
	transformJourneysQuery: id,

	parseDateTime,
	parsePlatform,
	parseProductsBitmask,
	parseIcon,
	parseWhen,
	parsePrognosisType,
	parseScheduledDays,
	parseDeparture,
	parseArrival,
	parseTrip,
	parseJourneyLeg,
	parseJourney,
	parseLine,
	parseStationName: (_, name) => name,
	parseLocation,
	parseCommon,
	parsePolyline,
	parseMovement,
	parseNearby,
	parseOperator,
	parseHint,
	parseWarning,
	parseStopover,

	formatAddress,
	formatCoord,
	formatDate,
	formatLocationFilter,
	formatProductsFilter,
	formatPoi,
	formatStation,
	formatTime,
	formatLocation,
	formatRectangle,
	filters,

	journeysOutFrwd: true,  // `journeys()` method: support for `outFrwd` field?
	// todo: https://github.com/KDE/kpublictransport/commit/c7c54304160d8f22eab0c91812a107aca82304b7

	// `departures()` method: support for `getPasslist` field?
	departuresGetPasslist: false,
	// `departures()` method: support for `stbFltrEquiv` field?
	departuresStbFltrEquiv: false,

	trip: false,
	radar: false,
	refreshJourney: true,
	// refreshJourney(): use `outReconL[]` instead of `ctxRecon`?
	refreshJourneyUseOutReconL: false,
	tripsByName: true,
	remarks: true,
	// `remarks()` method: support for `getPolyline` field?
	remarksGetPolyline: true, // `remarks()` method: support for `getPolyline` field?
	lines: true,
}

export {
	defaultProfile,
}