import { Repository } from 'typeorm';
import { ZoomAnalyticsAttendeeSummary } from 'src/common/entities';
import { SessionKpiFilter } from 'src/common/enum/session-kpi.enum';
import { AttendanceStatus } from 'src/common/enum/attendance-status.enum';
import { AppLoggerService } from 'src/common/services/logger.service';
import { UserTypeFilterValue } from 'src/common/utils/user-type-filter.util';
export interface AttendeeSummaryFilter {
    page: number;
    limit: number;
    search?: string;
    rmContactId?: number;
    kpiFilter?: SessionKpiFilter;
    lateCutoff?: Date;
    dropoffCutoff?: Date;
    registrationIds?: number[];
    systemAttendance?: AttendanceStatus;
    attendanceOutcome?: SessionKpiFilter[];
    knownStatus?: SessionKpiFilter[];
    userType?: UserTypeFilterValue[];
    generalOnly?: boolean;
    sortByJoinTime?: boolean;
    sortKey?: string;
    sortOrder?: 'ASC' | 'DESC';
}
export interface PaginatedAttendeeSummaries {
    data: ZoomAnalyticsAttendeeSummary[];
    total: number;
}
export declare class ZoomAnalyticsAttendeeSummaryRepository {
    private readonly repo;
    private readonly logger;
    constructor(repo: Repository<ZoomAnalyticsAttendeeSummary>, logger: AppLoggerService);
    findById(id: number): Promise<ZoomAnalyticsAttendeeSummary | null>;
    findAllByProgramAndRegistration(programId: number, registrationId: number): Promise<ZoomAnalyticsAttendeeSummary[]>;
    findAllByProgram(programId: number): Promise<ZoomAnalyticsAttendeeSummary[]>;
    findAllBySessionId(sessionId: number): Promise<ZoomAnalyticsAttendeeSummary[]>;
    listBySession(sessionId: number, filter: AttendeeSummaryFilter): Promise<PaginatedAttendeeSummaries>;
    private applyKpiFilter;
    private generatedLinkMatchSubQuery;
    private finalAttendedExistsSubQuery;
    private applyAttendanceOutcomeFilter;
    private applyKnownStatusFilter;
    private static readonly DURATION_BUCKET_SQL;
    getSessionAttendanceCounts(sessionIds: number[], rmContactId?: number): Promise<Map<number, {
        attended: number;
        absent: number;
        durationBuckets: {
            under60: number;
            from60to90: number;
            from90to120: number;
        };
    }>>;
    create(data: Partial<ZoomAnalyticsAttendeeSummary>): ZoomAnalyticsAttendeeSummary;
    save(row: ZoomAnalyticsAttendeeSummary): Promise<ZoomAnalyticsAttendeeSummary>;
    upsertMany(payloads: Array<Partial<ZoomAnalyticsAttendeeSummary> & {
        sessionId: number;
        registrationId: number | null;
        email: string;
    }>): Promise<ZoomAnalyticsAttendeeSummary[]>;
    private saveWithConflictRetry;
}
