import { ReservationDTO, ReservationsDTO } from '@roomstay/core';
import BasketAddonRow from '../../models/BasketAddonRow';
import BasketRow from '../../models/BasketRow';
import { ConfigCompany } from '../../models/Client/Hotel/Company';
import { Hotel } from '../../models/Client/Hotel/Hotel';
import { DateRange, GenericAnalyticsAccommodation } from '../DataLayer';
export interface IAnalyticMessageEvent extends Record<string, any> {
    event: string;
}
/**
 * Abstract class used to transform roomstay data into either GA4 or UA analytics events
 *
 * All logging still happens from the {@link DataLayer} class.
 */
export declare abstract class Analytics {
    protected hotel?: Hotel;
    protected company?: ConfigCompany;
    protected userId?: string;
    protected currency: {
        original: string;
        current: string;
    };
    protected itemListName: string;
    initialise(company?: ConfigCompany, hotel?: Hotel): void;
    setUserId(id?: string): void;
    setItemListName(itemListName?: string): void;
    private getUserData;
    /**
     * Merges the current user's data (user_id) into the provided input object.
     * Ensures the resulting object always includes user_id when available.
     */
    withUserData: <T extends IAnalyticMessageEvent>(input: T) => T & Partial<{
        user_id: string;
    }>;
    /**
     * Merges the current company name/property name into the provided input object.
     */
    withClientDetailsData: <T extends IAnalyticMessageEvent>(input: T) => T & {
        company?: string;
        property?: string;
    };
    updateCurrency(current: string, original: string): void;
    /** Assemble the message for a room impression post based on impressions added  */
    abstract generateRoomImpressionMessageObject(impressions: GenericAnalyticsAccommodation[]): IAnalyticMessageEvent;
    abstract generateProductClickMessageObject(product: GenericAnalyticsAccommodation): IAnalyticMessageEvent;
    abstract generateDateSelectionMessageObject(dateRange: DateRange, adults: number, children: number, infants?: number): IAnalyticMessageEvent;
    abstract generateAddToCartMessageObject(product: GenericAnalyticsAccommodation): IAnalyticMessageEvent;
    abstract generateAddonsAddToCartMessageObject(product: Required<Pick<GenericAnalyticsAccommodation, 'quantity' | 'dateRange' | 'basketAddonRow'>>): IAnalyticMessageEvent;
    abstract generateUpsellConfirmedMessageObject(oldProduct: GenericAnalyticsAccommodation, newProduct: GenericAnalyticsAccommodation): IAnalyticMessageEvent | null;
    abstract generateUpsellCancelledMessageObject(product: GenericAnalyticsAccommodation): IAnalyticMessageEvent;
    abstract generateCheckoutViewMessageObject(basketRows: BasketRow[], addonRows: BasketAddonRow[]): IAnalyticMessageEvent;
    abstract generateRoomPurchaseMessageObject(basketRows: BasketRow[], addonRows: BasketAddonRow[], reservations: ReservationsDTO): IAnalyticMessageEvent[];
    abstract generateRefundMessageObject(reservation: ReservationDTO): IAnalyticMessageEvent;
    generateRefundMessageObjectByReservationNumber(reservationNumber: string): {
        event: string;
        ecommerce: {
            refund: {
                actionField: {
                    id: string;
                };
            };
        };
    };
    /**
     * Get addon row total price from Reservations API response
     */
    getAddonRowTotalFromReservations: (addonRow: BasketAddonRow, reservations: ReservationsDTO) => number | undefined;
}
