import * as OJP_Types from 'ojp-shared-types';

interface HTTPConfig {
    url: string;
    authToken: string | null;
}
type Language = 'de' | 'fr' | 'it' | 'en';
type OJP_VERSION = '1.0' | '2.0';
type AnySDK = SDK<'1.0'> | SDK<'2.0'>;
interface XML_Config {
    ojpVersion: OJP_VERSION;
    defaultNS: 'ojp' | 'siri' | null;
    mapNS: Record<string, string>;
}
interface RequestInfo {
    requestDateTime: Date | null;
    requestXML: string | null;
    responseDateTime: Date | null;
    responseXML: string | null;
    parseDateTime: Date | null;
}

type ResponseOk<T> = {
    ok: true;
    value: T;
};
type ResponseError<E> = {
    ok: false;
    error: E;
};
type OJP_Response<T, E> = ResponseOk<T> | ResponseError<E>;
type FareRequestResponse = OJP_Response<OJP_Types.FareDeliverySchema, Error>;
type LocationInformationRequestResponse = OJP_Response<OJP_Types.LocationInformationDeliverySchema, Error>;
type OJPv1_LocationInformationRequestResponse = OJP_Response<OJP_Types.OJPv1_LocationInformationDeliverySchema, Error>;
type StopEventRequestResponse = OJP_Response<OJP_Types.StopEventDeliverySchema, Error>;
type OJPv1_StopEventRequestResponse = OJP_Response<OJP_Types.OJPv1_StopEventDeliverySchema, Error>;
type TripInfoRequestResponse = OJP_Response<OJP_Types.TripInfoDeliverySchema, Error>;
type OJPv1_TripInfoRequestResponse = OJP_Response<OJP_Types.OJPv1_TripInfoDeliverySchema, Error>;
type TripRefineRequestResponse = OJP_Response<OJP_Types.TRR_DeliverySchema, Error>;
type TripRequestResponse = OJP_Response<OJP_Types.TripDeliverySchema, Error>;
type OJPv1_TripRequestResponse = OJP_Response<OJP_Types.OJPv1_TripDeliverySchema, Error>;

type ResultSpec = {
    fetchResponse: unknown;
};
declare abstract class BaseRequest<S extends ResultSpec> {
    requestInfo: RequestInfo;
    mockRequestXML: string | null;
    mockResponseXML: string | null;
    protected constructor();
    static initWithRequestMock<T_This extends {
        Default(): any;
    }>(this: T_This, mockText: string): ReturnType<T_This['Default']>;
    static initWithResponseMock<T_This extends {
        Default(): any;
    }>(this: T_This, mockText: string): ReturnType<T_This['Default']>;
    protected abstract _fetchResponse(sdk: AnySDK): Promise<S['fetchResponse']>;
    fetchResponse(sdk: AnySDK): Promise<S['fetchResponse']>;
    abstract buildRequestXML(language: Language, requestorRef: string, xmlConfig: XML_Config): string;
}

declare abstract class SharedLocationInformationRequest<S extends ResultSpec> extends BaseRequest<S> {
    protected static DefaultRestrictionParams(): OJP_Types.LIR_RequestParamsSchema;
    updateRestrictions(restrictions: OJP_Types.LIR_RequestParamsSchema, placeTypes: OJP_Types.PlaceTypeEnum[], numberOfResults: number): void;
    static computeGeoRestriction(bboxData: string | number[]): OJP_Types.GeoRestrictionsSchema | null;
}

declare class LocationInformationRequest extends SharedLocationInformationRequest<{
    fetchResponse: LocationInformationRequestResponse;
}> {
    payload: OJP_Types.LocationInformationRequestSchema;
    protected constructor(restrictions: OJP_Types.LIR_RequestParamsSchema | undefined);
    static Default(): LocationInformationRequest;
    static initWithLocationName(name: string, placeTypes?: OJP_Types.PlaceTypeEnum[], numberOfResults?: number): LocationInformationRequest;
    static initWithPlaceRef(placeRefOrCoords: string, numberOfResults?: number): LocationInformationRequest;
    static initWithBBOX(bboxData: string | number[], placeTypes?: OJP_Types.PlaceTypeEnum[], numberOfResults?: number): LocationInformationRequest;
    buildRequestXML(language: Language, requestorRef: string, xmlConfig: XML_Config): string;
    protected _fetchResponse(sdk: SDK<'2.0'>): Promise<LocationInformationRequestResponse>;
}

declare abstract class SharedStopEventRequest<S extends ResultSpec> extends BaseRequest<S> {
    protected static DefaultRequestParams(version?: OJP_VERSION): OJP_Types.SER_RequestParamsSchema;
}

declare class StopEventRequest extends SharedStopEventRequest<{
    fetchResponse: StopEventRequestResponse;
}> {
    payload: OJP_Types.StopEventRequestSchema;
    protected constructor(location: OJP_Types.SER_RequestLocationSchema, params?: OJP_Types.SER_RequestParamsSchema | undefined);
    static Default(): StopEventRequest;
    static initWithPlaceRefAndDate(placeRefS: string, date?: Date): StopEventRequest;
    buildRequestXML(language: Language, requestorRef: string, xmlConfig: XML_Config): string;
    protected _fetchResponse(sdk: SDK<'2.0'>): Promise<StopEventRequestResponse>;
}

declare abstract class SharedTripInfoRequest<S extends ResultSpec> extends BaseRequest<S> {
    protected static DefaultRequestParams(): {
        includeCalls?: boolean;
        includeService?: boolean;
        includeTrackProjection?: boolean;
        includePlacesContext?: boolean;
        includeSituationsContext?: boolean;
    };
}

declare class TripInfoRequest extends SharedTripInfoRequest<{
    fetchResponse: TripInfoRequestResponse;
}> {
    payload: OJP_Types.TIR_RequestSchema;
    protected constructor(journeyRef: string, operatingDayRef: string, params?: OJP_Types.TIR_RequestParamsSchema);
    static Default(): TripInfoRequest;
    static initWithJourneyRef(journeyRef: string, journeyDate?: Date): TripInfoRequest;
    enableTrackProjection(): void;
    buildRequestXML(language: Language, requestorRef: string, xmlConfig: XML_Config): string;
    protected _fetchResponse(sdk: SDK<'2.0'>): Promise<TripInfoRequestResponse>;
}

type GeoPositionLike = OJP_Types.GeoPositionSchema | number[] | string;
declare class GeoPosition implements OJP_Types.GeoPositionSchema {
    longitude: number;
    latitude: number;
    properties: Record<string, any>;
    constructor(geoPositionArg: GeoPositionLike | number, optionalLatitude?: number | null);
    isValid(): boolean;
    distanceFrom(pointB: GeoPosition): number;
    asLatLngString(roundCoords?: boolean): string;
    asLngLat(): [number, number];
    asGeoPositionSchema(): OJP_Types.GeoPositionSchema;
}

declare class Trip implements OJP_Types.TripSchema {
    id: string;
    duration: string;
    startTime: string;
    endTime: string;
    transfers: number;
    leg: OJP_Types.LegSchema[];
    cancelled?: boolean;
    delayed?: boolean;
    deviation?: boolean;
    infeasible?: boolean;
    unplanned?: boolean;
    private constructor();
    static initWithTripXML(rawXML: string): Trip;
}
interface NearbyPlace {
    distance: number;
    object: Place;
}
declare class Place implements OJP_Types.PlaceSchema {
    stopPoint?: OJP_Types.StopPointSchema;
    stopPlace?: OJP_Types.StopPlaceSchema;
    topographicPlace?: OJP_Types.TopographicPlaceSchema;
    pointOfInterest?: OJP_Types.PointOfInterestSchema;
    address?: OJP_Types.AddressSchema;
    name: OJP_Types.InternationalTextSchema;
    geoPosition: GeoPosition;
    mode: OJP_Types.ModeStructureSchema[];
    attribute: OJP_Types.GeneralAttributeSchema[];
    placeType: OJP_Types.PlaceTypeEnum | null;
    private constructor();
    static initWithXMLSchema(placeSchema: OJP_Types.PlaceSchema): Place;
    static initWithCoords(geoPositionArg: GeoPositionLike | number, optionalLatitude?: number | null): Place;
    static Empty(): Place;
    findClosestPlace(otherPlaces: Place[]): NearbyPlace | null;
    asStopPlaceRefOrCoords(): string;
}
declare class PlaceResult implements OJP_Types.PlaceResultSchema {
    place: Place;
    complete: boolean;
    probability?: number;
    private constructor();
    static initWithXMLSchema(placeResultSchema: OJP_Types.PlaceResultSchema): PlaceResult;
    static initWithXML(nodeXML: string): PlaceResult;
}
declare class StopEventResult implements OJP_Types.StopEventResultSchema {
    id: string;
    stopEvent: OJP_Types.StopEventSchema;
    private constructor();
    static initWithXML(nodeXML: string): StopEventResult;
}

declare class TripRefineRequest extends BaseRequest<{
    fetchResponse: TripRefineRequestResponse;
}> {
    payload: OJP_Types.TRR_RequestSchema;
    protected constructor(tripResult: OJP_Types.TripResultSchema, refineParams?: OJP_Types.TRR_RequestParamsSchema);
    private static DefaultRequestParams;
    static Default(): TripRefineRequest;
    static initWithTrip(trip: Trip): TripRefineRequest;
    buildRequestXML(language: Language, requestorRef: string, xmlConfig: XML_Config): string;
    protected _fetchResponse(sdk: SDK<'2.0'>): Promise<TripRefineRequestResponse>;
}

type EndpointType = 'origin' | 'destination' | 'both';
declare abstract class SharedTripRequest<S extends ResultSpec> extends BaseRequest<S> {
    abstract setArrivalDatetime(newDatetime: Date): void;
    abstract setDepartureDatetime(newDatetime: Date): void;
    abstract setPublicTransportRequest(motFilter: OJP_Types.VehicleModesOfTransportEnum[] | null): void;
    abstract setCarRequest(): void;
    abstract setRailSubmodes(railSubmodes: OJP_Types.RailSubmodeEnum | OJP_Types.RailSubmodeEnum[]): void;
    abstract setMaxDurationWalkingTime(maxDurationMinutes: number | undefined, endpointType: EndpointType): void;
    abstract enableLinkProkection(): void;
    abstract disableLinkProkection(): void;
    abstract setNumberOfResults(resultsNo: number | null): void;
    abstract setNumberOfResultsAfter(resultsNo: number): void;
    abstract setNumberOfResultsBefore(resultsNo: number): void;
    abstract setWalkSpeedDeviation(walkSpeedPercent: number): void;
    abstract setOriginDurationDistanceRestrictions(minDuration: number | null, maxDuration: number | null, minDistance: number | null, maxDistance: number | null): void;
    abstract setDestinationDurationDistanceRestrictions(minDuration: number | null, maxDuration: number | null, minDistance: number | null, maxDistance: number | null): void;
    abstract setViaPlace(place: Place, dwellTime: number | null): void;
}

declare class TripRequest extends SharedTripRequest<{
    fetchResponse: TripRequestResponse;
}> {
    payload: OJP_Types.TripRequestSchema;
    protected constructor(origin: OJP_Types.PlaceContextSchema, destination: OJP_Types.PlaceContextSchema, via?: OJP_Types.ViaPointSchema[], params?: OJP_Types.TripParamsSchema | null);
    private static DefaultRequestParams;
    static Default(): TripRequest;
    static initWithPlaceRefsOrCoords(originPlaceRefS: string, destinationPlaceRefS: string): TripRequest;
    static initWithPlaces(origin: Place, destination: Place): TripRequest;
    setArrivalDatetime(newDatetime?: Date): void;
    setDepartureDatetime(newDatetime?: Date): void;
    setPublicTransportRequest(motFilter?: OJP_Types.VehicleModesOfTransportEnum[] | null): void;
    disableLinkProkection(): void;
    enableLinkProkection(): void;
    setCarRequest(): void;
    setMaxDurationWalkingTime(maxDurationMinutes?: number | undefined, endpointType?: EndpointType): void;
    setRailSubmodes(railSubmodes: OJP_Types.RailSubmodeEnum | OJP_Types.RailSubmodeEnum[]): void;
    setNumberOfResults(resultsNo: number | null): void;
    setNumberOfResultsAfter(resultsNo: number): void;
    setNumberOfResultsBefore(resultsNo: number): void;
    private setEndpointDurationDistanceRestrictions;
    setOriginDurationDistanceRestrictions(minDuration: number | null, maxDuration: number | null, minDistance: number | null, maxDistance: number | null): void;
    setDestinationDurationDistanceRestrictions(minDuration: number | null, maxDuration: number | null, minDistance: number | null, maxDistance: number | null): void;
    setWalkSpeedDeviation(walkSpeedPercent: number): void;
    setViaPlace(place: Place, dwellTime: number | null): void;
    buildRequestXML(language: Language, requestorRef: string, xmlConfig: XML_Config): string;
    protected _fetchResponse(sdk: SDK<'2.0'>): Promise<TripRequestResponse>;
}

declare class OJPv1_FareRequest extends BaseRequest<{
    fetchResponse: FareRequestResponse;
}> {
    payload: OJP_Types.FareRequestSchema[];
    protected constructor(items: OJP_Types.FareRequestSchema[]);
    private static DefaultRequestParams;
    static Default(): OJPv1_FareRequest;
    private static cleanTripForFareRequest;
    static initWithOJPv1Trips(trips: OJP_Types.OJPv1_TripSchema[]): OJPv1_FareRequest;
    buildRequestXML(language: Language, requestorRef: string, xmlConfig: XML_Config): string;
    protected _fetchResponse(sdk: SDK<'1.0'>): Promise<FareRequestResponse>;
}

declare class OJPv1_LocationInformationRequest extends SharedLocationInformationRequest<{
    fetchResponse: OJPv1_LocationInformationRequestResponse;
}> {
    payload: OJP_Types.OJPv1_LocationInformationRequestSchema;
    protected constructor(restrictions: OJP_Types.LIR_RequestParamsSchema);
    static Default(): OJPv1_LocationInformationRequest;
    static initWithLocationName(name: string, placeTypes?: OJP_Types.PlaceTypeEnum[], numberOfResults?: number): OJPv1_LocationInformationRequest;
    static initWithPlaceRef(placeRefOrCoords: string, numberOfResults?: number): OJPv1_LocationInformationRequest;
    static initWithBBOX(bboxData: string | number[], placeTypes?: OJP_Types.PlaceTypeEnum[], numberOfResults?: number): OJPv1_LocationInformationRequest;
    buildRequestXML(language: Language, requestorRef: string, xmlConfig: XML_Config): string;
    protected _fetchResponse(sdk: SDK<'1.0'>): Promise<OJPv1_LocationInformationRequestResponse>;
}

declare class OJPv1_StopEventRequest extends SharedStopEventRequest<{
    fetchResponse: OJPv1_StopEventRequestResponse;
}> {
    payload: OJP_Types.OJPv1_StopEventRequestSchema;
    protected constructor(location: OJP_Types.OJPv1_PlaceContextSchema, params?: OJP_Types.SER_RequestParamsSchema | undefined);
    static Default(): OJPv1_StopEventRequest;
    static initWithPlaceRefAndDate(placeRefS: string, date?: Date): OJPv1_StopEventRequest;
    buildRequestXML(language: Language, requestorRef: string, xmlConfig: XML_Config): string;
    protected _fetchResponse(sdk: SDK<'1.0'>): Promise<OJPv1_StopEventRequestResponse>;
}

declare class OJPv1_TripInfoRequest extends SharedTripInfoRequest<{
    fetchResponse: OJPv1_TripInfoRequestResponse;
}> {
    payload: OJP_Types.TIR_RequestSchema;
    protected constructor(journeyRef: string, operatingDayRef: string, params?: OJP_Types.TIR_RequestParamsSchema);
    static Default(): OJPv1_TripInfoRequest;
    static initWithJourneyRef(journeyRef: string, journeyDate?: Date): OJPv1_TripInfoRequest;
    enableTrackProjection(): void;
    buildRequestXML(language: Language, requestorRef: string, xmlConfig: XML_Config): string;
    protected _fetchResponse(sdk: SDK<'1.0'>): Promise<OJPv1_TripInfoRequestResponse>;
}

declare class OJPv1_TripRequest extends SharedTripRequest<{
    fetchResponse: OJPv1_TripRequestResponse;
}> {
    payload: OJP_Types.OJPv1_TripRequestSchema;
    protected constructor(origin: OJP_Types.OJPv1_PlaceContextSchema, destination: OJP_Types.OJPv1_PlaceContextSchema, via?: OJP_Types.OJPv1_ViaPointSchema[], params?: OJP_Types.OJPv1_TripParamsSchema | null);
    private static DefaultRequestParams;
    static Default(): OJPv1_TripRequest;
    static initWithPlaceRefsOrCoords(originPlaceRefS: string, destinationPlaceRefS: string): OJPv1_TripRequest;
    static initWithPlaces(origin: Place, destination: Place): OJPv1_TripRequest;
    setArrivalDatetime(newDatetime?: Date): void;
    setDepartureDatetime(newDatetime?: Date): void;
    disableLinkProkection(): void;
    enableLinkProkection(): void;
    setPublicTransportRequest(motFilter: OJP_Types.VehicleModesOfTransportEnum[] | null): void;
    setCarRequest(): void;
    setRailSubmodes(railSubmodes: OJP_Types.RailSubmodeEnum | OJP_Types.RailSubmodeEnum[]): void;
    setMaxDurationWalkingTime(maxDurationMinutes: number | undefined, endpointType: EndpointType): void;
    setNumberOfResults(resultsNo: number | null): void;
    setNumberOfResultsAfter(resultsNo: number): void;
    setNumberOfResultsBefore(resultsNo: number): void;
    setOriginDurationDistanceRestrictions(minDuration: number | null, maxDuration: number | null, minDistance: number | null, maxDistance: number | null): void;
    setDestinationDurationDistanceRestrictions(minDuration: number | null, maxDuration: number | null, minDistance: number | null, maxDistance: number | null): void;
    setWalkSpeedDeviation(walkSpeedPercent: number): void;
    setViaPlace(place: Place, dwellTime: number | null): void;
    buildRequestXML(language: Language, requestorRef: string, xmlConfig: XML_Config): string;
    protected _fetchResponse(sdk: SDK<'1.0'>): Promise<OJPv1_TripRequestResponse>;
}

declare class EmptyRequest {
    static init(): void;
}
declare const builders: {
    readonly '1.0': {
        readonly FareRequest: typeof OJPv1_FareRequest;
        readonly LocationInformationRequest: typeof OJPv1_LocationInformationRequest;
        readonly StopEventRequest: typeof OJPv1_StopEventRequest;
        readonly TripInfoRequest: typeof OJPv1_TripInfoRequest;
        readonly TripRefineRequest: typeof EmptyRequest;
        readonly TripRequest: typeof OJPv1_TripRequest;
    };
    readonly '2.0': {
        readonly FareRequest: typeof EmptyRequest;
        readonly LocationInformationRequest: typeof LocationInformationRequest;
        readonly StopEventRequest: typeof StopEventRequest;
        readonly TripInfoRequest: typeof TripInfoRequest;
        readonly TripRefineRequest: typeof TripRefineRequest;
        readonly TripRequest: typeof TripRequest;
    };
};
type Builders = typeof builders;
type RequestKey = keyof Builders['2.0'];
type ClassFor<V extends OJP_VERSION, K extends RequestKey> = Builders[V][K];
declare class SDK<V extends OJP_VERSION = '2.0'> {
    readonly version: OJP_VERSION;
    requestorRef: string;
    httpConfig: HTTPConfig;
    language: Language;
    private constructor();
    static create(requestorRef: string, httpConfig: HTTPConfig, language?: Language): SDK<'2.0'>;
    static v1(requestorRef: string, httpConfig: HTTPConfig, language?: Language): SDK<'1.0'>;
    get requests(): {
        [K in RequestKey]: ClassFor<V, K>;
    };
}

declare const SDK_VERSION = "0.21.4";
declare const DefaultXML_Config: XML_Config;
declare const XML_BuilderConfigOJPv1: XML_Config;
declare const XML_ParserConfigOJPv1: XML_Config;

declare class DateHelpers {
    static formatDate(d: Date): string;
    static formatTimeHHMM(d?: Date): string;
    static computeDelayMinutes(timetableTimeS: Date | string, estimatedTimeS: Date | string | null): number | null;
}

declare class XmlSerializer {
    xmlConfig: XML_Config;
    constructor(xmlConfig?: XML_Config);
    serialize(obj: Record<string, any>, wrapperNodeName: string): string;
    static transformTagName(tagName: string): string;
}

export { type AnySDK, DateHelpers, DefaultXML_Config, type FareRequestResponse, GeoPosition, type HTTPConfig, type Language, LocationInformationRequest, type LocationInformationRequestResponse, type OJP_VERSION, OJPv1_FareRequest, OJPv1_LocationInformationRequest, type OJPv1_LocationInformationRequestResponse, OJPv1_StopEventRequest, type OJPv1_StopEventRequestResponse, OJPv1_TripInfoRequest, type OJPv1_TripInfoRequestResponse, OJPv1_TripRequest, type OJPv1_TripRequestResponse, Place, PlaceResult, type RequestInfo, SDK, SDK_VERSION, StopEventRequest, type StopEventRequestResponse, StopEventResult, Trip, TripInfoRequest, type TripInfoRequestResponse, TripRefineRequest, type TripRefineRequestResponse, TripRequest, type TripRequestResponse, XML_BuilderConfigOJPv1, XML_ParserConfigOJPv1, XmlSerializer };
