import { EnvironmentName } from '@planpay/web/src/lib/shared-lib-duplicates';
import { EBookingFlow, EBookingPaymentMethod, EHotelCardProcessor, EHotelStateFieldConfiguration, EIntegration, EMembershipProvider, IHotelColorScheme } from '@roomstay/core';
import { Property } from 'csstype';
import type { ReactChild } from 'react';
import type { InternalMemberSignInInputs } from '../../../components/members/SignInModal/InternalMemberSignInModal.types';
import type { HotelRoomGroupsDTO, HotelRoomsDTO, HotelServiceDTO } from '../../Api/HotelDTO';
import type { TransportDistances } from '../../Api/HotelOverrideDTO';
import { CalendarHighlight } from '../../CalendarHighlight';
import type { HasDatalayerTags } from './Company';
import type { DistanceUnitType } from './DistanceUnitType.types';
import type HotelAddress from './HotelAddress';
import type { HotelDataSource } from './HotelDataSource.types';
import type { HotelPerk } from './HotelPerk';
import type { HotelRoomOverwrite } from './HotelRoomOverwrite';
import type { WeekdayStartsOn } from './WeekdayStartsOn.types';
import { HotelFee } from '../../Fee';
import type { Language } from '../../../providers/LanguageProvider';
import { RoomSort } from '../../../providers/RoomSortProvider';
export declare enum EPaymentCardType {
    Visa = "VI",
    Mastercard = "MC",
    JCB = "JC",
    AmericanExpress = "AX",
    DinersClub = "DN",
    UnionPay = "UP"
}
export interface IVGSVaultNames {
    standard: string;
    members: string;
}
export declare enum EHotelAddressRequirement {
    FullAddressRequired = "FullAddressRequired",
    AddressOptionalCountryRequired = "AddressOptionalCountryRequired",
    AddressOptional = "AddressOptional"
}
/**
 * This config comes from admin -- TODO: Move to Roomstay Core
 */
export interface AdminHotelConfig {
    hotelID: string;
    name: string;
    address?: HotelAddress;
    latitude?: number;
    longitude?: number;
    phone?: string;
    email?: string;
    checkInTime?: string;
    checkOutTime?: string;
    paymentCardTypes?: EPaymentCardType[];
    description?: string;
    locationDescription?: string;
    policies?: string;
    hotelServices: HotelServiceDTO[];
    businessServices: HotelServiceDTO[];
    rooms: HotelRoomsDTO;
    hasLoadedDetails?: boolean;
    dataSource: HotelDataSource;
    defaultCurrency: string;
    paymentMethods: EBookingPaymentMethod[];
    planpay?: {
        username: string;
        minDaysShowPlanpay: number;
        env: EnvironmentName;
    };
    windcave?: {
        enableDropInMode: boolean;
    };
    hotelUrl: string;
    heroImage: string;
    memberOnlyModalImage?: string;
    memberOnlyModalImageSize: Property.ObjectFit;
    images?: string[];
    logo: string | ReactChild;
    colors: IHotelColorScheme;
    distanceUnitType: DistanceUnitType;
    startsWeekOnDay?: WeekdayStartsOn;
    crossSellHotelIds?: string[];
    maxOccupancy?: number;
    minAdultAge?: number;
    maxAdultAge?: number;
    maxAdults?: number;
    maxChildren?: number;
    maxInfants?: number;
    countInfantsInOccupancy?: boolean;
    occupancyLimits?: {
        maxSelectableChildren: {
            [adultCount: number]: number;
        };
        maxSelectableInfants: {
            [adultCount: number]: number | undefined;
        };
        highestAdultConfig: number;
    };
    hideByLine?: boolean;
    transportDistances?: TransportDistances;
    roomGroups: HotelRoomGroupsDTO;
    cardProcessor: EHotelCardProcessor;
    rmsUseDepositQuote?: boolean;
    checkAreaAvailabilityOnRoomStep?: boolean;
    bookingFlow: EBookingFlow;
    /** @deprecated Use the new Fees model instead */
    enableCreditCardSurcharge?: boolean;
    availableCountries?: {
        name: string;
        value: string;
    }[];
    childConfiguration?: {
        supportChildren?: boolean;
        supportInfants: boolean;
        childRange: {
            min: number;
            max: number;
        };
        infantRange: {
            min: number;
            max: number;
        };
    };
    preventCancellation?: boolean;
    perks?: HotelPerk[];
    perkTitle?: string;
    stateFieldConfiguration?: EHotelStateFieldConfiguration;
    countryPrefix?: string;
    quoteImageDesktop?: string;
    quoteImageMobile?: string;
    memberOnlyImage?: string;
    captureChildAge?: boolean;
    itineraryNote: string;
    fees?: HotelFee[];
    addDepositFeeToBookingTotal?: boolean;
    company: {
        url?: string;
        logo?: string;
        enableDerbysoftFeed?: string;
    };
    facebookUrl: string;
    instagramUrl: string;
    linkedinUrl: string;
    preferProviderBookingId: boolean;
    disableSavedPayments?: boolean;
    showUnavailableRooms?: boolean;
    isRACMemberNoRequired?: boolean;
    metaPixelId?: string;
    enableAnalyticsDebug?: boolean;
    enableRoomUpsells?: boolean;
    enableRateUpsells?: boolean;
    countryCode: string | null;
    calendarHighlights: CalendarHighlight[];
    addressRequirement: EHotelAddressRequirement;
    maxRoomsPerBooking: number | null;
}
/**
 * This config comes from hard static local file
 */
export interface ClientHotelConfig {
    providerHotelID: string;
    shortName?: string;
    defaultDatepickerType?: 'Month' | 'Week';
    checkoutUrl?: string;
    defaultLanguage: Language;
    privacyPolicyUrl: string;
    bookNowPayLaterUrl?: string;
    bestRateNoBSUrl?: string;
    memberOnlyRates?: string[];
    memberOnlyPromoCode?: string;
    memberOnlyRenderRateLast?: boolean;
    memberOnlySignupInputs?: InternalMemberSignInInputs;
    googleMapsImage?: string;
    /**
     * Whether to show the Breakfast / Lunch / Dinner included
     */
    showMealPill?: boolean;
    perks?: HotelPerk[];
    perkTitle?: string;
    /**
     * Hide perks on room row
     */
    perksHideOnRoomRow?: boolean;
    /**
     * Hide perks on room detail modal
     */
    perksHideOnRoomDetail?: boolean;
    perksShowDisclaimer?: boolean;
    /** @deprecated  Use the vgs.vaultNames.standard property now */
    vgsVaultName?: string;
    vgs?: {
        vaultNames: IVGSVaultNames;
    };
    showAddonLoader: boolean;
    overwrites?: {
        [code: string]: Partial<HotelRoomOverwrite>;
    };
    forwardFindReservationToSynxis?: boolean;
    additionalOptions?: {
        [name: string]: any;
    };
    googleReCaptcha?: {
        loadForMembers?: boolean;
        siteKey?: string;
    };
    /**
     * Show description on RoomDetails
     */
    showDescriptionOnRoomDetails?: boolean;
    /**
     * Customize the Member modal colours. Specifically replacing the green (success) with the primary color of hotel (accent)
     */
    memberOnlyModalUsePrimaryColor?: boolean;
    /**
     * Callback to trigger specific events on load of a hotel.
     *
     * This is where you can specify custom fields, language overrides, feature toggles etc.
     */
    onLoad?: () => void;
    /**
     * Order available rooms
     */
    currentRoomSort?: RoomSort;
    /**
     * Order available rates
     */
    currentRoomRateSort?: RoomSort | undefined;
    maxAdults?: number;
    mobileDefaultRatesClosed?: boolean;
    memberOnlyImages?: Record<EMembershipProvider, string>;
    memberOnlyModalImages?: Record<EMembershipProvider, string>;
    memberOnlySignupLinks?: Record<EMembershipProvider, string>;
}
export interface ConfigHotel extends ClientHotelConfig, AdminHotelConfig, HasDatalayerTags {
}
export type Hotel = ConfigHotel & {
    lowestPrice?: {
        value: number;
        isLoading: boolean;
    };
    integrations?: EIntegration[];
    isRACMemberNoRequired?: boolean;
};
/**
 * Used for DetailsHotel event
 */
export type InitialHotelDetailsEventPayload = {
    name: string;
    hotelID: number | string;
    hotelUrl: string;
    currency: string;
    language: Language;
    address?: HotelAddress;
};
