import type { EventProperties, AnalyticsSnippet, Analytics, AnalyticsBrowser, Options } from '@segment/analytics-next';
import { ChordAnalyticsFormatters } from './formatters.js';
export interface ValidateResult {
    success: boolean;
    error?: any[];
    data?: any;
}
export interface ObjectTypes {
    Cart: any;
    Checkout: any;
    LineItem: any;
    Product: any;
}
export type AnyAnalytics = AnalyticsSnippet | Analytics | AnalyticsBrowser | ChordAnalyticsQueue;
export type AnyOptions = Options;
export type AnyProduct = {
    [key: string]: unknown;
};
export type AnyCart = {
    [key: string]: unknown;
};
export type AnyCheckout = {
    [key: string]: unknown;
};
export type AnyId = string | number;
export type AnyLineItem = {
    [key: string]: unknown;
};
export interface ChordAnalyticsOptions<T extends ObjectTypes = ObjectTypes> {
    cdp?: AnyAnalytics | (() => AnyAnalytics);
    cdpDomain?: string;
    cdpWriteKey?: string;
    consent?: 'ketch' | 'onetrust' | 'shopify' | 'segment';
    awaitConsent?: boolean;
    debug?: boolean;
    enableLogging?: boolean;
    enableWebPixelListener?: boolean;
    formatters: ChordAnalyticsFormatters<T>;
    namespace?: string;
    stripNull?: boolean;
    metadata: EventMetadata;
    awaitConsentTimeout?: number;
    middleware?: Array<() => void>;
}
export interface EventMetadata {
    i18n: i18nMetadata;
    ownership: ownershipMetadata;
    platform: platformMetadata;
    store: storeMetadata;
    version?: versionMetadata;
}
export interface i18nMetadata {
    currency: string;
    locale: string;
}
export interface ownershipMetadata {
    omsId: string;
    storeId: string;
    tenantId: string;
}
export interface platformMetadata {
    name: string;
    type: string;
}
export interface versionMetadata {
    major: number;
    minor: number;
    patch: number;
}
export interface storeMetadata {
    domain: string;
}
export type ChordAnalyticsQueue = {
    track: (...args: any[]) => void;
    identify: (...args: any[]) => void;
    page: (...args: any[]) => void;
    reset: (...args: any[]) => void;
};
type PageContext = {
    search: string;
    searchParams: Record<string, string>;
};
type MiddlewarePayload = {
    obj: {
        properties?: EventProperties;
        event: string;
        context: {
            page: PageContext;
        };
    };
};
type MiddlewareArgs = {
    payload: MiddlewarePayload;
    next: <T>(arg: T) => T;
};
export type AnalyticsMiddleware = (args: MiddlewareArgs) => Partial<EventProperties> | void;
export {};
