import { ProgramSession, ProgramRegistrationOnlineSession, BackgroundJob } from 'src/common/entities';
import { SessionProviderType } from 'src/common/enum/session-provider.enum';
import { CreateSessionInput, UpdateSessionInput, CreateSharedSessionInput } from 'src/common/interfaces/online-session.interface';
import { RegisterParticipantDto } from '../dto/register-participant.dto';
import { BulkRegisterParticipantsDto } from '../dto/bulk-register-participants.dto';
import { BulkRegistrationStart, BulkRegistrationFailureList, SessionRegistrationList, ProvisionStatusOverview, ProvisionRegistrationList, ProvisionRegistrationStatus, EligibleCountSummary, ProgramEligibleRegistrationList, ProgramEligibleRegistrationsQuery, RmContactOption, RegistrationActivationResult, SessionAttendanceSummary } from './online-session.interface';
import { RegistrationOnlineSessionActivationStatus } from 'src/common/enum/registration-online-session-activation-status.enum';
import { UserTypeFilterValue } from 'src/common/utils/user-type-filter.util';
export interface OnlineSessionProvider {
    readonly key: SessionProviderType;
    create(input: CreateSessionInput): Promise<ProgramSession>;
    createShared(input: CreateSharedSessionInput): Promise<ProgramSession[]>;
    generateGeneralLinks(session: ProgramSession, actorUserId?: number): void;
    update(session: ProgramSession, input: UpdateSessionInput): Promise<ProgramSession>;
    remove(session: ProgramSession, actorUserId?: number): Promise<void>;
    register(input: RegisterParticipantDto): Promise<ProgramRegistrationOnlineSession | void>;
    bulkRegister(input: BulkRegisterParticipantsDto, actorUserId?: number): Promise<BulkRegistrationStart>;
    bulkRegisterStatus(jobId: number): Promise<BackgroundJob>;
    bulkRegisterFailures(jobId: number, paging: {
        page: number;
        limit: number;
    }, rmContactId?: number): Promise<BulkRegistrationFailureList>;
    retryBulkRegistration(jobId: number, actorUserId?: number): Promise<BulkRegistrationStart>;
    getProgramRegistrationFailures(programId: number, query: {
        sessionId?: number;
        page: number;
        limit: number;
    }, rmContactId?: number): Promise<BulkRegistrationFailureList>;
    retryProgramRegistration(programId: number, sessionId?: number, actorUserId?: number): Promise<BulkRegistrationStart>;
    getProgramProvisionStatus(programId: number, sessionId?: number, rmContactId?: number, userType?: UserTypeFilterValue[]): Promise<ProvisionStatusOverview>;
    getSessionProvisionRegistrations(sessionId: number, query: {
        status?: ProvisionRegistrationStatus;
        page: number;
        limit: number;
        userType?: UserTypeFilterValue[];
    }, rmContactId?: number): Promise<ProvisionRegistrationList>;
    listRegistrations(sessionId: number, query: {
        page: number;
        limit: number;
        search?: string;
    }, rmContactId?: number): Promise<SessionRegistrationList>;
    exportRegistrations(sessionId: number, search?: string, rmContactId?: number): Promise<{
        fileUrl: string;
    }>;
    setRegistrationActivation(registrationId: number, activationStatus: RegistrationOnlineSessionActivationStatus, reason: string | null | undefined, actingUserId: number | null | undefined): Promise<RegistrationActivationResult>;
    getEligibleCount(sessionId: number): Promise<EligibleCountSummary>;
    listProgramEligibleRegistrations(programId: number, query: ProgramEligibleRegistrationsQuery): Promise<ProgramEligibleRegistrationList>;
    getProgramEligibleRmContacts(): Promise<RmContactOption[]>;
    getSessionAttendanceSummary(sessions: ProgramSession[], rmContactId?: number): Promise<Map<number, SessionAttendanceSummary>>;
}
