import { ConfigService } from '@nestjs/config';
import { PrismaService } from "../../../core/database/prisma/prisma.service";
import { Prisma } from '@prisma/client';
import { OutlookSyncRepository } from '../repositories/outlook-sync.repository';
import { OutlookAttendeeAutoAddService } from './outlook-attendee-auto-add.service';
import { ExcludeOutlookSeriesOccurrenceDto, ListOutlookCandidateChildrenQueryDto, ListManagedSeriesChildrenQueryDto, ListOutlookSeriesOccurrenceExclusionsQueryDto, ListOutlookBindingHistoryQueryDto, ListManagedOutlookBindingsQueryDto, ListAllManagedOutlookBindingsQueryDto, ListOutlookCandidatesQueryDto, ManageOutlookBindingDto, TakeoverOutlookBindingDto, UpdateOutlookSyncSettingsDto } from '../dto/outlook-sync.dto';
export declare const STRICT_SERIES_FILTER_FRESHNESS_MS: number;
export declare const RECONCILE_SERIES_SNAPSHOT_BACKFILL_LIMIT = 20;
export declare function shouldUseStrictSeriesMasterFilter(lastSyncedAt: Date | null | undefined, now: Date): boolean;
export declare class OutlookSyncService {
    private readonly configService;
    private readonly prisma;
    private readonly outlookSyncRepository;
    private readonly attendeeAutoAddService;
    private graphClient;
    private readonly mailboxSyncQueue;
    private readonly seriesBootstrapQueue;
    private readonly mailboxInitialSnapshotBootstrapQueue;
    private readonly mailboxSeriesSyncEnqueueAt;
    constructor(configService: ConfigService, prisma: PrismaService, outlookSyncRepository: OutlookSyncRepository, attendeeAutoAddService: OutlookAttendeeAutoAddService);
    private updateMailboxStatus;
    getSettings(): Promise<{
        id: string;
        createdAt: Date;
        updatedAt: Date;
        reconcileCron: string;
        deltaBatchSize: number;
        lookaheadDays: number;
        lookbackDays: number;
        renewBeforeMinutes: number;
        includeOrganizerAsAttendee: boolean;
    }>;
    updateSettings(payload: UpdateOutlookSyncSettingsDto): Promise<{
        id: string;
        createdAt: Date;
        updatedAt: Date;
        reconcileCron: string;
        deltaBatchSize: number;
        lookaheadDays: number;
        lookbackDays: number;
        renewBeforeMinutes: number;
        includeOrganizerAsAttendee: boolean;
    }>;
    listCandidates(query: ListOutlookCandidatesQueryDto, actor: {
        id: string;
        email: string;
    }): Promise<{
        mailbox: null;
        items: never[];
        pagination: {
            page: number;
            pageSize: number;
            total: number;
            totalPages: number;
        };
        snapshotInitializing?: undefined;
        sourceLagSeconds?: undefined;
    } | {
        mailbox: {
            id: string;
            mailboxEmail: string;
            mailboxType: import("@prisma/client").$Enums.OutlookMailboxType;
        };
        items: any[];
        snapshotInitializing: boolean;
        sourceLagSeconds: number | null;
        pagination: {
            page: number;
            pageSize: number;
            total: number;
            totalPages: number;
        };
    }>;
    private enqueueInitialSnapshotBootstrap;
    private backfillSeriesMasterSnapshotsIfMissing;
    private backfillCandidateSeriesChildrenSnapshotsForReconcile;
    listCandidateSeriesChildren(seriesMasterId: string, query: ListOutlookCandidateChildrenQueryDto, actor: {
        id: string;
        email: string;
    }): Promise<{
        mailbox: null;
        seriesMasterId: string;
        items: never[];
    } | {
        mailbox: {
            id: string;
            mailboxEmail: string;
            mailboxType: import("@prisma/client").$Enums.OutlookMailboxType;
        };
        seriesMasterId: string;
        items: any[];
    }>;
    private loadCandidateSeriesChildrenFromSnapshots;
    private hasSeriesChildrenSnapshots;
    private getCandidateSeriesMasterEvent;
    private getGraphEventFromRawPayload;
    private isSeriesMasterEnded;
    private enqueueMailboxSyncIfStaleSeries;
    private getSeriesChildCountMap;
    listManagedSeriesChildren(seriesMasterId: string, query: ListManagedSeriesChildrenQueryDto, _actor: {
        id: string;
        email: string;
    }): Promise<{
        seriesMasterId: string;
        items: ({
            meeting: {
                title: string;
                id: string;
                status: import("@prisma/client").$Enums.MeetingStatus;
                startTime: Date;
                endTime: Date;
                timezone: string;
            } | null;
            meetingSeries: {
                title: string;
                id: string;
                startDate: Date;
                timezone: string;
            } | null;
            primaryMailbox: {
                id: string;
                mailboxEmail: string;
            };
        } & {
            id: string;
            createdAt: Date;
            updatedAt: Date;
            meetingId: string | null;
            lastSyncedAt: Date | null;
            meetingSeriesId: string | null;
            graphEventId: string;
            iCalUId: string;
            graphSeriesMasterId: string | null;
            graphEventType: string;
            manageStatus: import("@prisma/client").$Enums.OutlookManageStatus;
            bootstrapStatus: import("@prisma/client").$Enums.OutlookBootstrapStatus | null;
            bootstrapError: string | null;
            bootstrapUpdatedAt: Date | null;
            ownerUserId: string | null;
            ownerEmail: string | null;
            primaryMailboxId: string;
            syncFrom: Date;
            cancellationSource: import("@prisma/client").$Enums.OutlookCancellationSource | null;
            syncMode: import("@prisma/client").$Enums.OutlookBindingSyncMode;
            localOverrideAt: Date | null;
            localOverrideByUserId: string | null;
            localOverrideByEmail: string | null;
            localOverrideReason: string | null;
            localOverrideFields: Prisma.JsonValue | null;
        })[];
        total: number;
    }>;
    manageBinding(payload: ManageOutlookBindingDto, actor: {
        id: string;
        email: string;
    }): Promise<{
        id: string;
        manageStatus: string;
    } | {
        binding: {
            id: string;
            createdAt: Date;
            updatedAt: Date;
            meetingId: string | null;
            lastSyncedAt: Date | null;
            meetingSeriesId: string | null;
            graphEventId: string;
            iCalUId: string;
            graphSeriesMasterId: string | null;
            graphEventType: string;
            manageStatus: import("@prisma/client").$Enums.OutlookManageStatus;
            bootstrapStatus: import("@prisma/client").$Enums.OutlookBootstrapStatus | null;
            bootstrapError: string | null;
            bootstrapUpdatedAt: Date | null;
            ownerUserId: string | null;
            ownerEmail: string | null;
            primaryMailboxId: string;
            syncFrom: Date;
            cancellationSource: import("@prisma/client").$Enums.OutlookCancellationSource | null;
            syncMode: import("@prisma/client").$Enums.OutlookBindingSyncMode;
            localOverrideAt: Date | null;
            localOverrideByUserId: string | null;
            localOverrideByEmail: string | null;
            localOverrideReason: string | null;
            localOverrideFields: Prisma.JsonValue | null;
        };
        meeting: {
            type: import("@prisma/client").$Enums.MeetingType;
            location: string | null;
            title: string;
            id: string;
            createdAt: Date;
            status: import("@prisma/client").$Enums.MeetingStatus;
            updatedAt: Date;
            description: string | null;
            startTime: Date;
            endTime: Date;
            timezone: string;
            creatorId: string;
            qrCodeOnline: string | null;
            qrCodeOffline: string | null;
            seriesId: string | null;
            instanceNumber: number | null;
            isSeriesMaster: boolean;
            hasCustomAttendees: boolean;
            city: string | null;
            enforceCheckinMode: boolean;
        } | null;
        bootstrapQueued: boolean;
    }>;
    private unmanageBindingByGraphEvent;
    resumeSync(bindingId: string, actor: {
        id: string;
        email: string;
    }): Promise<{
        message: string;
        bindingId: string;
        syncMode: "AUTO";
    }>;
    unmanageBinding(bindingId: string, actor: {
        id: string;
        email: string;
    }): Promise<({
        meeting: {
            type: import("@prisma/client").$Enums.MeetingType;
            location: string | null;
            title: string;
            id: string;
            createdAt: Date;
            status: import("@prisma/client").$Enums.MeetingStatus;
            updatedAt: Date;
            description: string | null;
            startTime: Date;
            endTime: Date;
            timezone: string;
            creatorId: string;
            qrCodeOnline: string | null;
            qrCodeOffline: string | null;
            seriesId: string | null;
            instanceNumber: number | null;
            isSeriesMaster: boolean;
            hasCustomAttendees: boolean;
            city: string | null;
            enforceCheckinMode: boolean;
        } | null;
        meetingSeries: {
            type: import("@prisma/client").$Enums.MeetingType;
            location: string | null;
            title: string;
            id: string;
            createdAt: Date;
            startDate: Date;
            endDate: Date | null;
            updatedAt: Date;
            description: string | null;
            isActive: boolean;
            timezone: string;
            frequency: number;
            creatorId: string;
            city: string | null;
            enforceCheckinMode: boolean;
            pattern: import("@prisma/client").$Enums.RecurrencePattern;
            maxOccurrences: number | null;
        } | null;
        primaryMailbox: {
            id: string;
            createdAt: Date;
            updatedAt: Date;
            mailboxEmail: string;
            mailboxType: import("@prisma/client").$Enums.OutlookMailboxType;
            isEnabled: boolean;
            isPrimaryDefault: boolean;
        };
        occurrenceExclusions: {
            id: string;
            createdAt: Date;
            updatedAt: Date;
            reason: string | null;
            iCalUId: string | null;
            bindingId: string;
            occurrenceGraphEventId: string;
            createdByEmail: string | null;
        }[];
    } & {
        id: string;
        createdAt: Date;
        updatedAt: Date;
        meetingId: string | null;
        lastSyncedAt: Date | null;
        meetingSeriesId: string | null;
        graphEventId: string;
        iCalUId: string;
        graphSeriesMasterId: string | null;
        graphEventType: string;
        manageStatus: import("@prisma/client").$Enums.OutlookManageStatus;
        bootstrapStatus: import("@prisma/client").$Enums.OutlookBootstrapStatus | null;
        bootstrapError: string | null;
        bootstrapUpdatedAt: Date | null;
        ownerUserId: string | null;
        ownerEmail: string | null;
        primaryMailboxId: string;
        syncFrom: Date;
        cancellationSource: import("@prisma/client").$Enums.OutlookCancellationSource | null;
        syncMode: import("@prisma/client").$Enums.OutlookBindingSyncMode;
        localOverrideAt: Date | null;
        localOverrideByUserId: string | null;
        localOverrideByEmail: string | null;
        localOverrideReason: string | null;
        localOverrideFields: Prisma.JsonValue | null;
    }) | null>;
    takeoverBinding(bindingId: string, payload: TakeoverOutlookBindingDto, actor: {
        id: string;
        email: string;
    }): Promise<({
        meeting: {
            type: import("@prisma/client").$Enums.MeetingType;
            location: string | null;
            title: string;
            id: string;
            createdAt: Date;
            status: import("@prisma/client").$Enums.MeetingStatus;
            updatedAt: Date;
            description: string | null;
            startTime: Date;
            endTime: Date;
            timezone: string;
            creatorId: string;
            qrCodeOnline: string | null;
            qrCodeOffline: string | null;
            seriesId: string | null;
            instanceNumber: number | null;
            isSeriesMaster: boolean;
            hasCustomAttendees: boolean;
            city: string | null;
            enforceCheckinMode: boolean;
        } | null;
        meetingSeries: {
            type: import("@prisma/client").$Enums.MeetingType;
            location: string | null;
            title: string;
            id: string;
            createdAt: Date;
            startDate: Date;
            endDate: Date | null;
            updatedAt: Date;
            description: string | null;
            isActive: boolean;
            timezone: string;
            frequency: number;
            creatorId: string;
            city: string | null;
            enforceCheckinMode: boolean;
            pattern: import("@prisma/client").$Enums.RecurrencePattern;
            maxOccurrences: number | null;
        } | null;
        primaryMailbox: {
            id: string;
            createdAt: Date;
            updatedAt: Date;
            mailboxEmail: string;
            mailboxType: import("@prisma/client").$Enums.OutlookMailboxType;
            isEnabled: boolean;
            isPrimaryDefault: boolean;
        };
        occurrenceExclusions: {
            id: string;
            createdAt: Date;
            updatedAt: Date;
            reason: string | null;
            iCalUId: string | null;
            bindingId: string;
            occurrenceGraphEventId: string;
            createdByEmail: string | null;
        }[];
    } & {
        id: string;
        createdAt: Date;
        updatedAt: Date;
        meetingId: string | null;
        lastSyncedAt: Date | null;
        meetingSeriesId: string | null;
        graphEventId: string;
        iCalUId: string;
        graphSeriesMasterId: string | null;
        graphEventType: string;
        manageStatus: import("@prisma/client").$Enums.OutlookManageStatus;
        bootstrapStatus: import("@prisma/client").$Enums.OutlookBootstrapStatus | null;
        bootstrapError: string | null;
        bootstrapUpdatedAt: Date | null;
        ownerUserId: string | null;
        ownerEmail: string | null;
        primaryMailboxId: string;
        syncFrom: Date;
        cancellationSource: import("@prisma/client").$Enums.OutlookCancellationSource | null;
        syncMode: import("@prisma/client").$Enums.OutlookBindingSyncMode;
        localOverrideAt: Date | null;
        localOverrideByUserId: string | null;
        localOverrideByEmail: string | null;
        localOverrideReason: string | null;
        localOverrideFields: Prisma.JsonValue | null;
    }) | null>;
    listBindingOccurrenceExclusions(bindingId: string, query: ListOutlookSeriesOccurrenceExclusionsQueryDto): Promise<{
        bindingId: string;
        items: {
            id: string;
            createdAt: Date;
            updatedAt: Date;
            reason: string | null;
            iCalUId: string | null;
            bindingId: string;
            occurrenceGraphEventId: string;
            createdByEmail: string | null;
        }[];
        pagination: {
            page: number;
            pageSize: number;
            total: number;
            totalPages: number;
        };
    }>;
    excludeSeriesOccurrence(bindingId: string, payload: ExcludeOutlookSeriesOccurrenceDto, actor: {
        id: string;
        email: string;
    }): Promise<{
        id: string;
        createdAt: Date;
        updatedAt: Date;
        reason: string | null;
        iCalUId: string | null;
        bindingId: string;
        occurrenceGraphEventId: string;
        createdByEmail: string | null;
    }>;
    removeSeriesOccurrenceExclusion(exclusionId: string, actor: {
        id: string;
        email: string;
    }): Promise<{
        removed: boolean;
        exclusionId: string;
    }>;
    listManagedBindings(query: ListManagedOutlookBindingsQueryDto): Promise<{
        mailbox: {
            id: string;
            mailboxEmail: string;
        };
        items: ({
            meeting: {
                title: string;
                id: string;
                status: import("@prisma/client").$Enums.MeetingStatus;
                startTime: Date;
                endTime: Date;
                timezone: string;
            } | null;
            meetingSeries: {
                title: string;
                id: string;
                startDate: Date;
                timezone: string;
            } | null;
        } & {
            id: string;
            createdAt: Date;
            updatedAt: Date;
            meetingId: string | null;
            lastSyncedAt: Date | null;
            meetingSeriesId: string | null;
            graphEventId: string;
            iCalUId: string;
            graphSeriesMasterId: string | null;
            graphEventType: string;
            manageStatus: import("@prisma/client").$Enums.OutlookManageStatus;
            bootstrapStatus: import("@prisma/client").$Enums.OutlookBootstrapStatus | null;
            bootstrapError: string | null;
            bootstrapUpdatedAt: Date | null;
            ownerUserId: string | null;
            ownerEmail: string | null;
            primaryMailboxId: string;
            syncFrom: Date;
            cancellationSource: import("@prisma/client").$Enums.OutlookCancellationSource | null;
            syncMode: import("@prisma/client").$Enums.OutlookBindingSyncMode;
            localOverrideAt: Date | null;
            localOverrideByUserId: string | null;
            localOverrideByEmail: string | null;
            localOverrideReason: string | null;
            localOverrideFields: Prisma.JsonValue | null;
        })[];
        pagination: {
            page: number;
            pageSize: number;
            total: number;
            totalPages: number;
        };
    }>;
    listAllManagedBindings(query: ListAllManagedOutlookBindingsQueryDto): Promise<{
        items: ({
            meeting: {
                title: string;
                id: string;
                status: import("@prisma/client").$Enums.MeetingStatus;
                startTime: Date;
                endTime: Date;
                timezone: string;
            } | null;
            meetingSeries: {
                title: string;
                id: string;
                startDate: Date;
                timezone: string;
            } | null;
            primaryMailbox: {
                id: string;
                mailboxEmail: string;
            };
        } & {
            id: string;
            createdAt: Date;
            updatedAt: Date;
            meetingId: string | null;
            lastSyncedAt: Date | null;
            meetingSeriesId: string | null;
            graphEventId: string;
            iCalUId: string;
            graphSeriesMasterId: string | null;
            graphEventType: string;
            manageStatus: import("@prisma/client").$Enums.OutlookManageStatus;
            bootstrapStatus: import("@prisma/client").$Enums.OutlookBootstrapStatus | null;
            bootstrapError: string | null;
            bootstrapUpdatedAt: Date | null;
            ownerUserId: string | null;
            ownerEmail: string | null;
            primaryMailboxId: string;
            syncFrom: Date;
            cancellationSource: import("@prisma/client").$Enums.OutlookCancellationSource | null;
            syncMode: import("@prisma/client").$Enums.OutlookBindingSyncMode;
            localOverrideAt: Date | null;
            localOverrideByUserId: string | null;
            localOverrideByEmail: string | null;
            localOverrideReason: string | null;
            localOverrideFields: Prisma.JsonValue | null;
        })[];
        pagination: {
            page: number;
            pageSize: number;
            total: number;
            totalPages: number;
        };
    }>;
    getBindingDetail(bindingId: string): Promise<{
        meeting: {
            type: import("@prisma/client").$Enums.MeetingType;
            location: string | null;
            title: string;
            id: string;
            createdAt: Date;
            status: import("@prisma/client").$Enums.MeetingStatus;
            updatedAt: Date;
            description: string | null;
            startTime: Date;
            endTime: Date;
            timezone: string;
            creatorId: string;
            qrCodeOnline: string | null;
            qrCodeOffline: string | null;
            seriesId: string | null;
            instanceNumber: number | null;
            isSeriesMaster: boolean;
            hasCustomAttendees: boolean;
            city: string | null;
            enforceCheckinMode: boolean;
        } | null;
        meetingSeries: {
            type: import("@prisma/client").$Enums.MeetingType;
            location: string | null;
            title: string;
            id: string;
            createdAt: Date;
            startDate: Date;
            endDate: Date | null;
            updatedAt: Date;
            description: string | null;
            isActive: boolean;
            timezone: string;
            frequency: number;
            creatorId: string;
            city: string | null;
            enforceCheckinMode: boolean;
            pattern: import("@prisma/client").$Enums.RecurrencePattern;
            maxOccurrences: number | null;
        } | null;
        primaryMailbox: {
            id: string;
            createdAt: Date;
            updatedAt: Date;
            mailboxEmail: string;
            mailboxType: import("@prisma/client").$Enums.OutlookMailboxType;
            isEnabled: boolean;
            isPrimaryDefault: boolean;
        };
        occurrenceExclusions: {
            id: string;
            createdAt: Date;
            updatedAt: Date;
            reason: string | null;
            iCalUId: string | null;
            bindingId: string;
            occurrenceGraphEventId: string;
            createdByEmail: string | null;
        }[];
    } & {
        id: string;
        createdAt: Date;
        updatedAt: Date;
        meetingId: string | null;
        lastSyncedAt: Date | null;
        meetingSeriesId: string | null;
        graphEventId: string;
        iCalUId: string;
        graphSeriesMasterId: string | null;
        graphEventType: string;
        manageStatus: import("@prisma/client").$Enums.OutlookManageStatus;
        bootstrapStatus: import("@prisma/client").$Enums.OutlookBootstrapStatus | null;
        bootstrapError: string | null;
        bootstrapUpdatedAt: Date | null;
        ownerUserId: string | null;
        ownerEmail: string | null;
        primaryMailboxId: string;
        syncFrom: Date;
        cancellationSource: import("@prisma/client").$Enums.OutlookCancellationSource | null;
        syncMode: import("@prisma/client").$Enums.OutlookBindingSyncMode;
        localOverrideAt: Date | null;
        localOverrideByUserId: string | null;
        localOverrideByEmail: string | null;
        localOverrideReason: string | null;
        localOverrideFields: Prisma.JsonValue | null;
    }>;
    getBindingHistory(bindingId: string, query: ListOutlookBindingHistoryQueryDto): Promise<{
        bindingId: string;
        items: any;
        pagination: {
            page: number;
            pageSize: number;
            total: any;
            totalPages: number;
        };
    }>;
    exportBindingHistoryCsv(bindingId: string, query: ListOutlookBindingHistoryQueryDto): Promise<{
        filename: string;
        content: string;
    }>;
    triggerReconcile(mailboxId?: string): Promise<{
        accepted: boolean;
        mailboxId: string;
    }>;
    handleChangeNotifications(notifications: any[]): Promise<void>;
    handleLifecycleNotifications(lifecycleEvents: any[]): Promise<void>;
    reconcileAllEnabledMailboxes(): Promise<void>;
    syncAllEnabledMailboxesDelta(): Promise<void>;
    renewSubscriptionsIfNeeded(): Promise<{
        renewed: number;
    }>;
    validateNotificationClientState(inputClientState?: string): boolean;
    syncMailboxDelta(mailboxId: string, isReconcile: boolean): Promise<void>;
    private enqueueMailboxSync;
    private drainMailboxSyncQueue;
    private runMailboxDeltaSync;
    private applyRemovedEvent;
    private applyUpdatedEvent;
    private reconcileManagedBindings;
    private resolveCandidateMailbox;
    private parseBooleanLike;
    private loadCandidateSnapshots;
    private listEndedCandidateSeriesMasterIds;
    private shouldStrictFilterSeriesMaster;
    private ensureActorMailbox;
    private createOrUpdateMeetingFromEvent;
    private ensureSeriesIfNeeded;
    private resolveManageRootEvent;
    private resolveSeriesMetadataEvent;
    private bootstrapSeriesOccurrences;
    private enqueueSeriesBootstrapTask;
    private ensureOccurrenceBindingForSeriesEvent;
    private populateBindingOwnerFallback;
    private isEventInSyncWindow;
    private syncAttendees;
    private deriveMeetingStatus;
    private parseGraphDateTime;
    private parseGraphDateTimeSafe;
    private parseGraphDateTimeToMs;
    private resolveDateTimeTimezone;
    private resolveEventTimezone;
    private getNormalizedEventType;
    private toCandidateItem;
    private toCandidateItemFromSnapshot;
    private isDateInSyncWindow;
    private parseOptionalDate;
    private upsertEventSnapshot;
    private deleteEventSnapshot;
    private isEffectivelyCancelledEvent;
    private escapeCsv;
    private formatCsvDate;
    private mapRecurrencePattern;
    private resolveSeriesRange;
    private mapCancellationSource;
    private getGraphClient;
    private getWebhookUrl;
    private canCreateWebhookSubscription;
    private createGraphSubscription;
    private renewGraphSubscription;
    private deleteGraphSubscription;
    private fetchCalendarViewEvents;
    private fetchManageEvent;
    private fetchSeriesInstanceEvents;
    private fetchSeriesMasterEvents;
    private fetchSeriesMasterEventsByIds;
    private fetchEventById;
    private getFallbackCreatorId;
    private resolveMeetingCreatorId;
    private hydrateEventForSync;
    private captureSourceVersionForBinding;
    private normalizeEventPayload;
    private buildDiffPayload;
    private countInternalMatchedAttendees;
    private countInternalMatchedFromNormalizedPayload;
    private countMeetingRequiredAttendees;
    private logBindingEvent;
    private logSyncErrorByGraphEventId;
    private extractGraphError;
    private wrapGraphError;
}
