import { ProgramSession } from 'src/common/entities';
import { OnlineTypeEnum } from 'src/common/enum/online-type.enum';
import { ExportJobStatus } from 'src/common/enum/export-job-status.enum';
import { JobTypeEnum } from 'src/common/enum/job-type.enum';
import { RegistrationOnlineSessionActivationStatus } from 'src/common/enum/registration-online-session-activation-status.enum';
import { ProgramEligibleKpiCategory, ProgramEligibleKpiFilter } from 'src/common/enum/program-eligible-kpi.enum';
import { SessionCommunicationStatusSummary } from 'src/session-communication/session-communication.types';
import { MeetingDetails, WebinarDetails } from 'src/common/interfaces/online-details.interface';
export interface OnlineSessionListResult {
    data: ProgramSession[];
    total: number;
}
export interface OnlineSessionPagination {
    totalPages: number;
    pageNumber: number;
    pageSize: number;
    totalRecords: number;
    numberOfRecords: number;
}
export interface OnlineSessionList {
    data: ProgramSession[];
    pagination: OnlineSessionPagination;
}
export interface BulkOnlineSessionFailure {
    programSessionId: number;
    error: string;
}
export interface BulkOnlineSessionResult {
    created: ProgramSession[];
    failed: BulkOnlineSessionFailure[];
}
export interface BulkRegistrationStart {
    jobId: number;
    status: ExportJobStatus;
    total: number;
}
export interface BulkRegistrationFailure {
    registrationId: number;
    sessionId: number;
    reason: string;
    message?: string;
}
export interface BulkRegistrationIneligible {
    registrationId: number;
    registrationSeqNumber: string | null;
    reason: string;
}
export interface BulkRegistrationJobMetadata {
    sessionIds: number[];
    role: string;
    batchSize: number;
    eligibleCount: number;
    ineligible: BulkRegistrationIneligible[];
    failures: BulkRegistrationFailure[];
    retryOfJobId?: number;
}
export interface BulkRegistrationStatus {
    jobId: number;
    type: string;
    status: ExportJobStatus;
    total: number;
    generated: number;
    skipped: number;
    failed: number;
    eligible: number;
    ineligible: BulkRegistrationIneligible[];
    errorMessage: string | null;
    retryOfJobId: number | null;
    completedAt: Date | null;
}
export interface BulkRegistrationFailureRow {
    registrationId: number;
    registrationSeqNumber: string | null;
    fullName: string | null;
    email: string | null;
    mobile: string | null;
    sessionId: number;
    sessionName: string | null;
    reason: string;
    message?: string;
    joinUrl: string | null;
    activationStatus: RegistrationOnlineSessionActivationStatus | null;
}
export interface BulkRegistrationFailureList {
    data: BulkRegistrationFailureRow[];
    pagination: {
        page: number;
        limit: number;
        total: number;
    };
}
export interface SessionRegistrationRow {
    registrationId: number;
    registrationSeqNumber: string | null;
    fullName: string | null;
    email: string | null;
    mobile: string | null;
    registrationStatus: string;
    seatAllocated: boolean;
    joinUrl: string | null;
    isPanelist: boolean | null;
    activationStatus: RegistrationOnlineSessionActivationStatus | null;
}
export interface SessionRegistrationList {
    data: SessionRegistrationRow[];
    pagination: {
        page: number;
        limit: number;
        total: number;
    };
}
export interface ProgramEligibleRegistrationRow {
    registrationId: number;
    registrationSeqNumber: string | null;
    fullName: string | null;
    email: string | null;
    mobile: string | null;
    seatAllocated: 'Yes' | 'No';
    gender: string | null;
    profileUrl: string | null;
    activationStatus: string;
    rmContact: string | null;
    paymentStatus: string | null;
    registrationMode: string | null;
    age: number | null;
    city: string | null;
    joinUrl: string | null;
    attendedSessions: string;
    sessionAttendance: ProgramSessionAttendance[];
}
export type SessionAttendanceState = 'not_started' | 'in_progress' | 'completed';
export interface ProgramSessionAttendance {
    sessionId: number;
    name: string | null;
    sessionState: SessionAttendanceState;
    status: boolean;
}
export interface ProgramEligibleKpis {
    totalEligible: number;
    active: number;
    inactive: number;
    absentAtLeastOnce: number;
    presentForAll: number;
    totalSessions: number;
    eligibleForFinalSession: number | null;
    notEligibleForFinalSession: number | null;
}
export interface ProgramEligibleKpiTile {
    label: string;
    value: number;
    kpiCategory?: ProgramEligibleKpiCategory;
    kpiFilter?: ProgramEligibleKpiFilter;
}
export interface ProgramEligibleRegistrationList {
    data: ProgramEligibleRegistrationRow[];
    pagination: {
        offset: number;
        limit: number;
        total: number;
    };
    kpis: ProgramEligibleKpiTile[];
}
export interface ProgramEligibleRegistrationsQuery {
    offset: number;
    limit: number;
    search?: string;
    sortKey?: string;
    sortOrder?: 'ASC' | 'DESC';
    filters?: Record<string, string | string[]>;
    rmContactId?: number;
    kpiCategory?: ProgramEligibleKpiCategory;
    kpiFilter?: ProgramEligibleKpiFilter;
}
export interface RmContactOption {
    id: number;
    name: string;
}
export interface RegistrationActivationResult {
    registrationId: number;
    activationStatus: RegistrationOnlineSessionActivationStatus;
    updatedOnlineSessionIds: number[];
}
export interface EligibleCountSummary {
    onlineSessionId: number;
    totalEligible: number;
    activeCount: number;
    inactiveCount: number;
}
export interface ProvisionCounts {
    totalEligible: number;
    generated: number;
    failed: number;
    yetToGenerate: number;
    generalLinks: number;
}
export interface ProvisionKpiTile {
    label: string;
    value: number;
    filter?: ProvisionRegistrationStatus;
}
export interface ProvisionSessionStatus {
    session: ProgramSession;
    counts: ProvisionCounts;
    kpis: ProvisionKpiTile[];
}
export interface ProvisionStatusOverview {
    programId: number;
    totalEligible: number;
    sessions: ProvisionSessionStatus[];
}
export type ProvisionRegistrationStatus = 'generated' | 'failed' | 'pending' | 'generalLink';
export interface ProvisionRegistrationRow {
    registrationId: number | null;
    registrationSeqNumber: string | null;
    fullName: string | null;
    email: string | null;
    mobile: string | null;
    status: string;
    joinUrl: string | null;
    activationStatus: string | null;
    reason?: string;
    message?: string;
    generatedLinkId: number | null;
}
export interface ProvisionRegistrationList {
    sessionId: number;
    summary: ProvisionCounts;
    kpis: ProvisionKpiTile[];
    data: ProvisionRegistrationRow[];
    pagination: {
        page: number;
        limit: number;
        total: number;
    };
}
export type SessionBulkCommunicationStatus = SessionCommunicationStatusSummary;
export interface SessionBulkCommunications {
    welcome: SessionBulkCommunicationStatus | null;
    invite: SessionBulkCommunicationStatus | null;
    absent: SessionBulkCommunicationStatus | null;
    valueCard: SessionBulkCommunicationStatus | null;
    programCompletion: SessionBulkCommunicationStatus | null;
}
export interface ProgramBulkCommunications {
    welcome: SessionBulkCommunicationStatus | null;
    programCompletion: SessionBulkCommunicationStatus | null;
}
export interface PendingSessionJob {
    id: number;
    type: JobTypeEnum;
    status: ExportJobStatus;
    createdAt: Date;
    completedAt: Date | null;
}
export interface OnlineSessionResponse {
    id: number;
    programId: number | null;
    programSessionId: number;
    name: string;
    onlineType: OnlineTypeEnum;
    startsAt: Date;
    endsAt: Date;
    registrationStartsAt: Date;
    registrationEndsAt: Date;
    webinarDetails: WebinarDetails | null;
    meetingDetails: MeetingDetails | null;
    actualMeetingEndsAt: Date | null;
    hostStartOpensMinutesBefore: number | null;
    completed: boolean;
    finalized: boolean;
    duration?: number | null;
    communications?: SessionBulkCommunications;
    attendanceSummary?: SessionAttendanceSummary;
    registered?: number;
    attended?: number;
    absent?: number;
    under60?: number;
    from60to90?: number;
    from90to120?: number;
    valueCardDetails: {
        description: string;
        documentUrls: string[];
    } | null;
    pretestValueCardDetails: {
        description: string;
        documentUrls: string[];
    } | null;
    pendingJob?: PendingSessionJob | null;
}
export interface SessionAttendanceDurationBuckets {
    under60: number;
    from60to90: number;
    from90to120: number;
}
export interface SessionAttendanceSummary {
    onlineSessionId: number;
    registered: number;
    attended: number;
    absent: number;
    durationBuckets: SessionAttendanceDurationBuckets;
}
