import TaskEvent from './models/TaskEvent';
import TaskCommand from './models/TaskCommand';
import SystemAlert from './models/SystemAlert';
/**
 * @fileoverview This file contains various types and variables used in the application.
 * @module types
 */
/**
 * The environment options for the client.
 */
export type Environment = 'live-eu' | 'canary' | 'test' | 'dev';
/**
 * An array of all supported languages.
 */
export declare const allLanguages: readonly ["en", "ar", "bg", "cs", "da", "de", "el", "es", "et", "fi", "fr", "hu", "id", "it", "ja", "ko", "lt", "lv", "nb", "nl", "pl", "pt", "ro", "ru", "sk", "sl", "sv", "tr", "uk", "zh"];
/**
 * A union type of all supported languages.
 */
export type AllLanguages = typeof allLanguages[number];
export type LangType = {
    [key in AllLanguages]?: string;
};
/**
 * The local payment types.
 * @cash - Cash payment type.
 * @card - Card payment type.
 * There can be more local payments so this is not an exhaustive list.
 */
export declare const localPaymentTypes: readonly ["cash", "card"];
/**
 * The external payment types.
 */
export declare const externalPaymentTypes: readonly ["external"];
/**
 * An array of all supported payment types.
 */
export declare const allPaymentTypes: readonly ["cash", "card", "external"];
/**
 * A union type of all supported payment types.
 * This includes both local and external payment types.
 * Also includes string to allow future extensibility.
 */
export type AllPaymentTypes = typeof allPaymentTypes[number] | string;
/**
 * The authentication parameters.
 */
export type AuthParams = {
    username: string;
    password: string;
};
/**
 * The options for the client.
 */
export type ClientOptions = {
    environment?: Environment;
    reconnectInterval?: number;
};
/**
 * The login parameters for DDP (Distributed Data Protocol) login.
 */
export type DDPLoginParams = {
    password: string;
    user: {
        username: string;
    };
};
/**
 * The user object containing user information.
 */
export type User = {
    id: string;
    token: string;
    tokenExpires: Date;
    type: 'password' | 'resume';
};
/**
 * The event types for the client.
 * @connected - The client is connected to the server.
 * @disconnected - The client is disconnected from the server.
 * @error - An error occurred.
 * @login - The client successfully logged in.
 * @logout - The client successfully logged out.
 */
export type ClientEventTypes = {
    connected: [];
    disconnected: [];
    error: [message: string];
    login: [user: User];
    logout: [];
};
/**
 * The base data for a system alert.
 */
export type SystemAlertDataBase = {
    systemAlertType: SystemAlertTypes;
} & Record<string, any>;
/**
 * Long running tasks that need to be checked.
 * @systemAlertType The type of system alert.
 * @tasks The tasks that need to be checked.
 */
export interface LongRunningTasks extends SystemAlertDataBase {
    systemAlertType: 'long-running-tasks';
    tasks: (TaskEvent | TaskCommand)[];
}
export type SystemAlertDataList = LongRunningTasks;
/**
 * The event types for the service handler.
 * @newTasks - New tasks were received.
 * @systemAlert - A system alert was received. List of system alerts can be found in the SystemAlertTypes type.
 */
export type ServiceHandlerEventTypes = {
    newTasks: [tasks: (TaskEvent | TaskCommand)[]];
    systemAlert: SystemAlert[];
};
/**
 * The options for the service handler.
 */
export type ServiceHandlerOptions = {
    tenantId: string;
};
/**
 * The response for the ping request.
 */
export type PingResponse = 'pong';
/**
 * The test data for the API v1 event.
 */
export type apiV1EventTestData = {
    test: 'test';
};
/**
 * The types of system alerts.
 * @longRunningTasks - There are tasks that didn't finish in a reasonable time frame so they need to be checked.
 */
export declare enum SystemAlertType {
    'long-running-tasks' = 1
}
/**
 * The types of tasks.
 */
export declare enum TaskType {
    'event' = 1,
    'command' = 2
}
/**
 * The status of a task.
 */
export declare enum TaskStatus {
    'added' = 1,
    'processing' = 2,
    'processed' = 3,
    'failed' = 4,
    'refused' = 5
}
/**
 * The types of payment.
 */
export declare enum PaymentTypes {
    'card' = 0,
    'cash' = 1
}
/**
 * The general ID data for an entity.
 */
export type ElementIdData = {
    id: string;
    externalId?: string;
};
/**
 * The general ID with extended data for an entity.
 */
export type ElementIdExtendedData = {
    id: string;
    price: number;
    externalId?: string;
};
/**
 * The ID data for a customer.
 * @id The unique ID of the customer.
 * @position The position of the customer. First customer that joined the table is 1, second is 2, etc.
 * If server placed the order the id will be "server" and position will be 0.
 */
export type CustomerData = {
    id: string;
    position: number;
};
/**
 * The options for specifying an ID.
 * You can either use the ID or the external ID but at least one must be specified.
 */
export type DataIdType = {
    id?: string;
    externalId?: string;
};
/**
 * The data for an incoming task.
 */
export type IncomingTaskData = {
    _id: string;
    taskType: TaskType;
    status: TaskStatus;
    data: TaskEventDataList | TaskCommandDataList;
    dateCreated: Date;
    dateLastRun: Date | undefined;
    retries: number | undefined;
};
/**
 * The available command types.
 */
export declare const commandTypes: readonly ["test", "confirm-universal-menu-elements"];
/**
 * The types of commands.
 */
export type CommandTypes = typeof commandTypes[number];
/**
 * The base data for a task command.
 */
export type TaskCommandDataBase = {
    commandType: CommandTypes;
    commandData?: Record<string, any>;
    timestamp: string;
};
/**
 * The data for a test command.
 */
export interface TestCommandData extends TaskCommandDataBase {
    commandType: 'test';
}
/**
 * The data for confirm universal menu elements command.
 */
export interface ConfirmUniversalMenuElementsCommandData extends TaskCommandDataBase {
    commandType: 'confirm-universal-menu-elements';
    commandData: {
        elements: ElementIdData[];
        tableSessionId?: string;
    };
}
/**
 * The list of task command data.
 */
export type TaskCommandDataList = TestCommandData | ConfirmUniversalMenuElementsCommandData;
/**
 * The data for order items.
 */
export type OrderItemsData = {
    orderItemId: string;
    customerData: CustomerData;
    menuItemData: ElementIdExtendedData;
    menuData?: ElementIdData;
    variantData?: ElementIdExtendedData;
    selectablesData?: ElementIdExtendedData[];
    status: 'added' | 'pending' | 'confirmed' | 'cancelled' | 'unknown';
    quantity: number;
    additionalRequests?: string;
};
/**
 * The data for an order.
 * @tableData The data for the table.
 * @tableSessionData The data for the table session.
 * @orderItems The order items that were added to the table.
 * @paymentDetails If the order was paid, the payment details will be included here.
 */
export type OrderEventData = {
    tableData: ElementIdData;
    tableSessionData: ElementIdData;
    orderItems: OrderItemsData[];
    paymentDetails?: OrderPaymentDetailsData;
};
/**
 * The available event types.
 */
export declare const eventTypes: readonly ["test", "customer-joined-table", "order-items-added", "order-items-confirmed", "order-items-cancelled", "order-items-changed", "order-items-moved", "payment-requested", "payment-request-cancelled", "order-items-payment-requested", "order-items-payment-confirmed", "order-items-payment-cancelled", "universal-menu-elements-added", "universal-menu-elements-updated", "universal-menu-elements-removed", "tables-added", "tables-updated", "tables-removed"];
/**
 * The types of events.
 */
export type EventTypes = typeof eventTypes[number];
/**
 * The available system alert types.
 */
export declare const systemAlertTypes: readonly ["long-running-tasks"];
/**
 * The types of system alerts.
 */
export type SystemAlertTypes = typeof systemAlertTypes[number];
/**
 * The base data for a task event.
 */
export type TaskEventDataBase = {
    eventType: EventTypes;
    eventData: Record<string, any>;
    timestamp: string;
};
/**
 * The data for a test event.
 */
export interface TestEventData extends TaskEventDataBase {
    eventType: 'test';
    eventData: {
        test: 'test';
    };
}
/**
 * The data for a customer joined table event.
 */
export interface CustomerJoinedTableEventData extends TaskEventDataBase {
    eventType: 'customer-joined-table';
    eventData: {
        tableData: ElementIdData;
        id: string;
        name: string;
        language: AllLanguages;
    };
}
/**
 * The data for order items added, confirmed, cancelled or changed events.
 */
export interface OrderItemsChangedEventData extends TaskEventDataBase {
    eventType: 'order-items-added' | 'order-items-confirmed' | 'order-items-cancelled' | 'order-items-changed';
    eventData: OrderEventData;
}
/**
 * The data for order items moved event.
 */
export interface OrderItemsMovedEventData extends TaskEventDataBase {
    eventType: 'order-items-moved';
    eventData: {
        tableSessionData: ElementIdData;
        fromTableData: ElementIdData;
        toTableData: ElementIdData;
        orderItems: OrderItemsData[];
    };
}
export type TaskOrderPaymentFeeType = 'serviceFee' | 'convenienceFee' | 'deliveryFee' | 'other';
export type TaskOrderPaymentFeesType = Partial<Record<TaskOrderPaymentFeeType, {
    amount: number;
}>>;
/**
 * The data for a payment.
 * @paymentId The ID of the payment.
 * @paymentType The type of payment.
 * @orderItemsPrice The price of the order items including service fee if there is any.
 * @tipAmount The tip amount.
 * @totalPrice The total price including the tip.
 * @needReceipt Whether a receipt is needed.
 * @isPaid Whether the payment has already been paid.
 * @fees Any additional fees that are not included in the order items price.
 */
interface TaskOrderPaymentDetailsDataBase {
    paymentId: string;
    paymentType: AllPaymentTypes;
    orderItemsPrice: number;
    tipAmount: number;
    totalPrice: number;
    needReceipt: boolean;
    isPaid: boolean;
    fees?: TaskOrderPaymentFeesType;
}
export interface TaskOrderPaymentDetailsDataInternal extends TaskOrderPaymentDetailsDataBase {
    paymentType: typeof localPaymentTypes[number] | string;
}
export interface TaskOrderPaymentDetailsDataExternal extends TaskOrderPaymentDetailsDataBase {
    paymentType: 'external';
    paymentProcessor: string;
}
export type OrderPaymentDetailsData = TaskOrderPaymentDetailsDataInternal | TaskOrderPaymentDetailsDataExternal;
/**
 * The data for a payment event.
 * @tableData The data for the table.
 * @tableSessionData The data for the table session.
 * @orderItems The order items that were paid.
 * @paymentDetails The payment details.
 */
export type PaymentEventData = {
    tableData: ElementIdData;
    tableSessionData: ElementIdData;
    orderItems: OrderItemsData[];
    paymentDetails: OrderPaymentDetailsData;
};
/**
 * @deprecated payment-requested and payment-request-cancelled events are deprecated, use order-items-payment-requested, order-items-payment-confirmed and order-items-payment-cancelled events instead.
 * The data for the payment requested event.
 */
export interface PaymentRequestedEventData extends TaskEventDataBase {
    eventType: 'payment-requested' | 'payment-request-cancelled';
    eventData: {
        tableData: ElementIdData;
        paymentType: typeof PaymentTypes;
    };
}
/**
 * The data for a payment requested, confirmed or cancelled event.
 */
export interface PaymentsEventData extends TaskEventDataBase {
    eventType: 'order-items-payment-requested' | 'order-items-payment-confirmed' | 'order-items-payment-cancelled';
    eventData: PaymentEventData;
}
export interface UniversalMenuElementsEventData extends TaskEventDataBase {
    eventType: 'universal-menu-elements-added' | 'universal-menu-elements-updated' | 'universal-menu-elements-removed';
    eventData: (UniversalMenuItem | UniversalMenuCategory)[];
}
export interface TablesEventData extends TaskEventDataBase {
    eventType: 'tables-added' | 'tables-updated' | 'tables-removed';
    eventData: NativeTable[];
}
/**
 * The list of task event data.
 */
export type TaskEventDataList = TestEventData | CustomerJoinedTableEventData | OrderItemsChangedEventData | PaymentRequestedEventData | PaymentsEventData | UniversalMenuElementsEventData | TablesEventData | OrderItemsMovedEventData;
export type UniversalMenuItemData = {
    id: string;
    externalId?: string;
    enabled: boolean;
    label: LangType;
    internalName?: string;
    price: number;
    description?: LangType;
    longDescription?: LangType;
    created: string;
    updated: string;
};
export type UniversalMenuItem = {
    type: 'item';
    data: UniversalMenuItemData;
};
export type UniversalMenuCategoryData = {
    id: string;
    externalId?: string;
    enabled: boolean;
    label: LangType;
    created?: string;
    updated?: string;
};
/**
 * Represents a universal menu category.
 */
export type UniversalMenuCategory = {
    type: 'category';
    data: UniversalMenuCategoryData;
};
/**
 * Represents a native table.
 */
export type NativeTable = {
    id: string;
    externalId?: string;
    accessCode: string;
    label: LangType;
    created: string;
    updated: string;
};
/**
 * Custom order item that can be added to a table
 * @orderItemId Optional ID of the ordered item that can be used to identify the order and update / delete it later - if not provided it will be automatically generated
 * @label The mandatory label of the order item - one of the supported languages must be provided
 * @price The price of the order item
 * @quantity The quantity of the order item
 * @additionalRequests Optional additional requests for the order item
 */
export type CustomOrderItem = {
    orderItemId?: string;
    label: LangType;
    price: number;
    quantity: number;
    additionalRequests?: string;
};
export type UpsertUniversalMenuItemsReturn = {
    updated: number;
    new: number;
    unchanged: number;
    failed?: number;
    failedItems?: {
        error: string;
        item: Partial<UniversalMenuItemData>;
    }[];
};
export type UpsertTablesReturn = {
    updated: number;
    new: number;
    unchanged: number;
    failed?: number;
    failedTables?: {
        error: string;
        table: Partial<NativeTable>;
    }[];
};
export type CancelOrderItemsReturn = {
    cancelled: number;
    failed: number;
    failedOrderItemIds?: string[];
};
export {};
