import * as react from 'react';
import { ReactNode } from 'react';
import { Review, RatingAggregate, Page } from '@platform-modules/commerce-reviews';
export { Page, RatingAggregate, Review, ReviewRating, ReviewStatus, isImmutableFieldError, isNotPurchasedError, isReviewNotFoundError, isReviewValidationError } from '@platform-modules/commerce-reviews';

interface ReviewListOpts {
    cursor?: string;
    limit?: number;
}
interface SubmitReviewWire {
    productId: string;
    purchaseId: string;
    rating: number;
    body?: string | null;
}
type OptimisticReview = Omit<Review, 'id' | 'userId'> & {
    id: null;
    userId?: string;
};
interface ReviewsClient {
    listReviews(productId: string, opts?: ReviewListOpts): Promise<unknown>;
    getRatingAggregate(productId: string): Promise<unknown>;
    submitReview(input: SubmitReviewWire): Promise<unknown>;
}
declare function useReviewsClient(hook: string): ReviewsClient;

declare function ReviewsProvider({ client, children, }: {
    client: ReviewsClient;
    children: ReactNode;
}): react.JSX.Element;

type PublicReview = Omit<Review, 'userId'> & {
    userId?: string;
};
declare function reviveRequiredDate(v: unknown, ctx: string): Date;
/** Wire JSON → typed PublicReview. §5 — userId optional per §1.3 PII-strip. */
declare function reviveReview(raw: unknown): PublicReview;
/** Wire JSON → typed Page<PublicReview>. §5 */
declare function reviveReviewPage(raw: unknown): Page<PublicReview>;
/** Wire JSON → typed RatingAggregate. §5 — validation only, no transform. */
declare function reviveRatingAggregate(raw: unknown): RatingAggregate;

declare function useReviewList(productId: string, opts?: ReviewListOpts, seed?: Page<PublicReview>): {
    data: Page<PublicReview> | undefined;
    loading: boolean;
    error: Error | null;
    reload: () => void;
};

declare function useRatingAggregate(productId: string, seed?: RatingAggregate): {
    data: RatingAggregate | undefined;
    loading: boolean;
    error: Error | null;
    reload: () => void;
};

declare function useSubmitReview(): {
    submit: (input: SubmitReviewWire) => Promise<PublicReview>;
    pending: boolean;
    optimistic: OptimisticReview | undefined;
    result: PublicReview | undefined;
    error: unknown;
    reset: () => void;
};

/** Thrown when a reviews hook is used outside <ReviewsProvider> (§2). */
declare class ReviewsProviderError extends Error {
    readonly name = "ReviewsProviderError";
    constructor(hook: string);
}
declare function isReviewsProviderError(e: unknown): e is ReviewsProviderError;
/** Thrown by reviveReview on malformed serialized wire input (§5). */
declare class ReviewWireError extends Error {
    readonly name = "ReviewWireError";
    constructor(message: string);
}
declare function isReviewWireError(e: unknown): e is ReviewWireError;

export { type OptimisticReview, type PublicReview, type ReviewListOpts, ReviewWireError, type ReviewsClient, ReviewsProvider, ReviewsProviderError, type SubmitReviewWire, isReviewWireError, isReviewsProviderError, reviveRatingAggregate, reviveRequiredDate, reviveReview, reviveReviewPage, useRatingAggregate, useReviewList, useReviewsClient, useSubmitReview };
