import { ReactNode } from 'react';
import { AuthParams, BulkUploadSelectorData, BulkUploadSortKey, CompletedSubTab, ID, MissingReceiptsTab, MonthYearPeriod, SortOrder, TransactionType } from '@zeniai/client-epic-state';
import { FooterFormIdType } from '../../common';
import { default as TableSection } from '../../components/TableSection';
import { MissingReceiptsBulkUploadInteractions } from './useMissingReceiptsBulkUploadFiles';
export interface PendingMatchInfo {
    attachmentId: ID;
    batchId: ID;
    fileName: string;
    transactionId: ID;
    transactionType: string;
}
export interface MissingReceiptsPageProps {
    authParams: AuthParams;
    /** Upload + drag/drop state from ExpenseAutomationPage (nav strip uses same handlers). */
    bulkUploadInteractions: MissingReceiptsBulkUploadInteractions;
    bulkUploadSelector: BulkUploadSelectorData | undefined;
    isAccountingClassesEnabled: boolean;
    missingReceiptsTab: MissingReceiptsTab;
    missingTransactionCount: number;
    pendingMatchAttachmentId: ID | null;
    pendingMatchTransactionId: ID | null;
    selectedPeriod: MonthYearPeriod;
    tableSectionProps: {
        allThreadsSectionOpen: boolean;
        currentFooterFormId: FooterFormIdType;
        isCOTEnabled: boolean;
        parentProps: Parameters<typeof TableSection>[0] extends infer T ? Omit<T, "isCOTEnabled" | "selectedMainTab" | "setIsJeAccountSettingsOpened" | "setResetJeAccountSettingsForm" | "allThreadsSectionOpen" | "setCurrentFooterFormId" | "currentFooterFormId" | "onCloseAllThreadsSection"> : never;
        onCloseAllThreadsSection: () => void;
        setCurrentFooterFormId: (formId: FooterFormIdType) => void;
        setIsJeAccountSettingsOpened: (isOpened: boolean) => void;
        setResetJeAccountSettingsForm: (fn: () => void) => void;
    };
    bulkUploadEndpoint?: string;
    /** When the nav is hidden (full-view panel), bulk upload chrome is rendered in the page body. */
    missingReceiptsBulkUploadChromeInPageBody?: ReactNode;
    /** When the nav is hidden (full-view panel), completed-tab sub-tabs + description render in the page body. */
    missingReceiptsCompletedChromeInPageBody?: ReactNode;
    transactionAttachmentsEndpoint?: string;
    onMissingReceiptsRowClick: (transactionId: ID, transactionType: TransactionType) => void;
    onPendingMatchChange: (info: PendingMatchInfo | null) => void;
    setMissingReceiptsTab: (tab: MissingReceiptsTab) => void;
    onBulkUploadFiles?: (files: File[]) => void;
    onBulkUploadSuccess?: (batchId: string) => void;
    /**
     * Wipes the bulk-upload details cache and `initialBatchDetailsLoaded` flag on tenant/period
     * change. Distinct from a stale-while-revalidate refresh — the new scope's data is genuinely
     * unknown, so the Unmatched skeleton is the correct UX.
     */
    onClearBulkUploadBatchDetailsForScopeChange?: () => void;
    onDeleteUnmatchedReceipt?: (attachmentId: ID) => void;
    onFetchBulkUploadBatches?: (input?: {
        cacheOverride?: boolean;
        invalidateBatchDetailsCache?: boolean;
    }) => void;
    onFetchCompletedTransactions?: (pageToken?: string, cacheOverride?: boolean) => void;
    onFetchMoreBatchDetails?: () => void;
    onLoadMoreManualSearch?: () => void;
    onResetBulkUploadSort?: () => void;
    /** Empty `query` or fewer than 2 trimmed chars: clear manual search results (no new search). */
    onSearchTransactionsForManualMatch?: (query: string, pageToken?: string | null) => void;
    onSetBulkUploadCompletedSubTab?: (tab: CompletedSubTab) => void;
    onSetBulkUploadSortConfig?: (sortKey: BulkUploadSortKey, sortOrder: SortOrder) => void;
}
export declare const MissingReceiptsPage: (props: MissingReceiptsPageProps) => import("react/jsx-runtime").JSX.Element;
