import * as react from 'react';
import { ReactNode } from 'react';
import { Order, OrderListFilter, Page } from '@platform-modules/commerce-orders';
export { Actor, BuyerRef, Order, OrderLine, OrderListFilter, OrderStatus, Page, PriceMode, ProductKind, StepRecord, VendorSplit, isImmutableFieldError, isOrderChargeConflictError, isOrderIdempotencyConflictError, isOrderIntegrityError, isOrderNotChargeableError, isOrderNotFoundError, isOrderValidationError, isRefundExceedsPaidError } from '@platform-modules/commerce-orders';

/**
 * Injected, DB-free data seam for browser-side order reads (§2).
 * The host wires each method to an API route it owns; the route derives the
 * actor from the authenticated session (NEVER a client-supplied param — §0.3
 * IDOR floor) and calls the core getOrderById/listOrders, then runs the
 * exported reviveOrder/reviveOrderPage helpers (§3) before returning the typed
 * value. The one production transport is HTTP; an in-process core wrapper and a
 * mock are test doubles, not production adapters. `actor`/`db` are bound
 * host-side and never appear here.
 */
interface OrdersClient {
    /** Typed order detail; null = not found OR caller not entitled (core collapses both → null). */
    getOrderById(id: string): Promise<Order | null>;
    /** Typed page of orders for the authenticated caller. */
    listOrders(filter?: OrderListFilter): Promise<Page<Order>>;
}

/** Pure client-injection context (§5) — no shared mount-state, no mount fetch. */
declare function OrdersProvider({ client, children }: {
    client: OrdersClient;
    children: ReactNode;
}): react.JSX.Element;

declare function useOrder(id: string, seed?: {
    initialData?: Order | null;
}): {
    order: Order | null;
    loading: boolean;
    error: Error | null;
    reload: () => void;
};

declare function useOrderList(filter: OrderListFilter, seed?: {
    initialData?: Page<Order>;
}): {
    page: Page<Order> | null;
    loading: boolean;
    error: Error | null;
    reload: () => void;
};

/** Thrown when an orders hook is used outside <OrdersProvider> (§5). */
declare class OrdersProviderError extends Error {
    readonly name = "OrdersProviderError";
    constructor(hook: string);
}
declare function isOrdersProviderError(e: unknown): e is OrdersProviderError;
/** Thrown by reviveOrder/reviveOrderPage on malformed serialized wire input (§3). */
declare class OrderWireError extends Error {
    readonly name = "OrderWireError";
    constructor(message: string);
}
declare function isOrderWireError(e: unknown): e is OrderWireError;

declare function reviveOrder(raw: unknown): Order;
declare function reviveOrderPage(raw: unknown): Page<Order>;

export { OrderWireError, type OrdersClient, OrdersProvider, OrdersProviderError, isOrderWireError, isOrdersProviderError, reviveOrder, reviveOrderPage, useOrder, useOrderList };
