import type { ManagementFooterContent, PulledCourses, PulledEventCategories, PulledEvents, PulledVenues } from '../../client/management/types';
import type { LocalCourse, LocalEvent, LocalEventCategory, LocalFooterContent, LocalTheme, LocalVenue } from '../content/reader';
export type DryRunDiffType = 'create' | 'update' | 'unchanged';
export interface DryRunDiffSummary {
    create: number;
    update: number;
    unchanged: number;
}
export interface DryRunItemDiff {
    type: DryRunDiffType;
    identifier: string;
    changes?: string[];
}
export declare function calculateKeyedArrayPullDiff<TRemote, TLocal>(args: {
    remoteItems: TRemote[];
    localItems: TLocal[];
    getRemoteId: (item: TRemote) => string;
    getLocalId: (item: TLocal) => string;
    remoteToComparable: (item: TRemote) => Record<string, unknown>;
    localToComparable: (item: TLocal) => Record<string, unknown>;
}): {
    diffs: DryRunItemDiff[];
    summary: DryRunDiffSummary;
};
export declare function formatDryRunArrayDiff(args: {
    label: string;
    diffs: DryRunItemDiff[];
    summary: DryRunDiffSummary;
}): {
    summaryText: string;
    detailText: string;
};
/**
 * Format keyed array diff with field-level before/after values for human display.
 * Used by pull --dry-run --diff for scoped pulls (venues, events, etc.).
 */
export declare function formatHumanArrayDiff<TRemote, TLocal>(args: {
    label: string;
    diffs: DryRunItemDiff[];
    summary: DryRunDiffSummary;
    remoteItems: TRemote[];
    localItems: TLocal[];
    getRemoteId: (item: TRemote) => string;
    getLocalId: (item: TLocal) => string;
    remoteToComparable: (item: TRemote) => Record<string, unknown>;
    localToComparable: (item: TLocal) => Record<string, unknown>;
}): {
    summaryText: string;
    detailText: string;
};
export declare function calculateThemePullDiff(args: {
    remoteTheme: unknown | null;
    localTheme: LocalTheme | null;
}): {
    type: DryRunDiffType;
    changes?: string[];
};
export declare function calculateFooterPullDiff(args: {
    remoteFooter: ManagementFooterContent | null;
    localFooter: LocalFooterContent | null;
}): {
    type: DryRunDiffType;
    changes?: string[];
};
export declare function mapRemoteVenueToLocalComparable(v: PulledVenues['venues'][number]): Record<string, unknown>;
export declare function mapLocalVenueToComparable(v: LocalVenue): Record<string, unknown>;
export declare function mapRemoteEventCategoryToLocalComparable(c: PulledEventCategories['eventCategories'][number]): Record<string, unknown>;
export declare function mapLocalEventCategoryToComparable(c: LocalEventCategory): Record<string, unknown>;
export declare function mapRemoteEventToLocalComparable(e: PulledEvents['events'][number]): Record<string, unknown>;
export declare function mapLocalEventToComparable(e: LocalEvent): Record<string, unknown>;
export declare function mapRemoteCourseToLocalComparable(course: PulledCourses['courses'][number]): Record<string, unknown>;
export declare function mapLocalCourseToComparable(course: LocalCourse): Record<string, unknown>;
