import { EGuaranteePolicyDepositMode } from '@roomstay/core';
import { Dayjs } from 'dayjs';
import { HotelFee, ItemisedFee } from '../Fee';
import type { Room } from './Room';
import RoomRateNight, { IRoomRateNight } from './RoomRateNight';
import type RoomRateSortable from './RoomRateSortable';
import type { Serializable } from '../Serializable';
export declare enum RoomRatePriceInclusion {
    ExcludingFees = "Fees Excluded",
    ExcludingTaxes = "Taxes Excluded",
    ExcludingFeesAndTaxes = "Excluding Fees and Taxes",
    IncludingFeesAndTaxes = "Including Fees and Taxes"
}
export interface IRoomRate {
    name: string;
    code: string;
    description: string;
    longDescription?: string;
    isMemberOnly?: boolean;
    guaranteeCode: string;
    cancelPolicyCode: string;
    nightRates: {
        [date: string]: IRoomRateNight;
    };
    lowestPrice: number;
    promoCode: string;
    promoCodeName: string;
    mealsIncluded?: {
        breakfast: boolean;
        lunch: boolean;
        dinner: boolean;
    };
    rateOverrides?: RateOverride[];
    minNightStayOverride?: number;
    isUpsellRate?: boolean;
    nightsToDiscount?: number;
    artificialDiscountPercent: number | null;
    artificialDiscountAmount: number | null;
}
export type RateLabelsByDay = {
    Monday: boolean;
    Tuesday: boolean;
    Wednesday: boolean;
    Thursday: boolean;
    Friday: boolean;
    Saturday: boolean;
    Sunday: boolean;
};
export type RateOverride = {
    name: string;
    shortDescription: string;
    longDescription: string;
    enabledPerDay: RateLabelsByDay;
    startDate: string;
    endDate: string;
    queryStartDate: string;
    queryEndDate: string;
};
export type RateOverrideKeys = 'name' | 'shortDescription' | 'longDescription';
interface RequestedDate {
    startDate: Dayjs;
    endDate: Dayjs;
}
interface DisplayRate {
    name: string;
    shortDescription: string;
    longDescription: string;
    startDate?: Dayjs;
    endDate?: Dayjs;
    override: RateOverride;
}
export declare class RoomRate implements RoomRateSortable, Serializable<RoomRate, IRoomRate> {
    name: string;
    code: string;
    description: string;
    longDescription: string;
    isMemberOnly: boolean;
    guaranteeCode: string;
    cancelPolicyCode: string;
    nightRates: {
        [date: string]: RoomRateNight;
    };
    lowestPrice: number;
    promoCode?: string;
    promoCodeName?: string;
    mealsIncluded?: {
        breakfast: boolean;
        lunch: boolean;
        dinner: boolean;
    };
    private nightRatesArray;
    private room;
    rateOverrides?: RateOverride[];
    minNightStayOverride?: number;
    isUpsellRate?: boolean;
    nightsToDiscount?: number;
    artificialDiscountPercent: number | null;
    artificialDiscountAmount: number | null;
    constructor();
    static fromData(data: Partial<{
        code: string;
    }> | any): RoomRate;
    applyData(data: any): void;
    setRoom(room: Room): void;
    getRoom(): Room;
    /**
     * Do not use this method if RMS deposit quotes are enabled.
     */
    getDepositAccordingToGuaranteePolicy(bookingRateFees: number): number;
    getTotalPrice: (getCost?: boolean) => number;
    getTotalPriceBeforeDiscount: (getCost?: boolean) => number;
    getTotalDiscount: () => number;
    isStayXPayYRate: () => boolean;
    getAveragePrice: (getCost?: boolean) => number;
    /**
     * Average nightly price before ANY discount (real + artificial combined correctly)
     */
    getAveragePriceBeforeDiscount: (getCost?: boolean) => number;
    getTotalFees: () => number;
    getItemisedFees: (hotelFees: HotelFee[]) => ItemisedFee[];
    getTotalTaxes: () => number;
    getPriceType: () => RoomRatePriceInclusion;
    getGuaranteePolicy: () => Omit<import("@roomstay/core").IAvailabilityGuaranteePolicyDetails, "depositMode"> & {
        depositMode: EGuaranteePolicyDepositMode | null;
    };
    getCancellationPolicy: () => string;
    getPriceSortValue: () => number;
    /**
     * Not implemented
     */
    getRecommendedSortValue(): number;
    getOrderSortValue(): number;
    serialize(): IRoomRate;
    unSerialize(data: IRoomRate): this;
    private getNightRateArray;
    private reduceNightData;
    private nightRateTotal;
    datesOverlap: (startDate1: Dayjs, endDate1: Dayjs, startDate2: Dayjs, endDate2: Dayjs) => boolean;
    getDefaultLabelsByDate: (requestedDate: RequestedDate) => {
        label: string;
        alternateLabel: string;
    }[];
    getPossiblyOverwrittenDetails: (requestedDate: RequestedDate) => {
        name: string;
        shortDescription: string;
        longDescription: string;
    };
    getAvailableRateOverrides: () => RateOverride[];
    hasRateVariesByDay: (requestedDate: RequestedDate) => boolean;
    getDisplayRates: (requestedDate: RequestedDate) => DisplayRate[];
    displayRateToDayLabel: (displayRate: DisplayRate) => string;
    displayRateToDayName: (displayRate: DisplayRate) => string;
    getLabelsByDate: (requestedDate: RequestedDate) => {
        label: string;
        alternateLabel: string;
        shortDescription?: string;
        longDescription?: string;
    }[];
}
export {};
