import { RegistrationOnlineSessionActivationStatus } from 'src/common/enum/registration-online-session-activation-status.enum';
import { SessionKpiCategory, SessionKpiFilter } from 'src/common/enum/session-kpi.enum';
import { AttendanceStatus } from 'src/common/enum/attendance-status.enum';
import { GeneratedLinkSourceType } from 'src/common/enum/generated-link-source-type.enum';
import { UserTypeFilterValue } from 'src/common/utils/user-type-filter.util';
import { SessionCommunicationStatusSummary } from 'src/session-communication/session-communication.types';
export interface ZoomSessionKpis {
    sessionId: number;
    startTime: Date | null;
    durationMinutes: number | null;
    totalPanelists: number;
    totalSeekersJoined: number;
    seekersNotJoined: number;
    seekersJoinedLate: number;
    seekersDropped: number;
    seekersRejoined: number;
    finalPresent: number;
    finalAbsent: number;
    reconciledAt: Date | null;
}
export interface ZoomGeneralAttendeeKpis {
    sessionId: number;
    totalGeneralAttendees: number;
    knownAttendees: number;
    unknownAttendees: number;
    generalLoggedIn: number;
    generalJoinedLate: number;
    generalDropped: number;
    generalRejoined: number;
}
export interface ZoomLiveStatus {
    sessionId: number;
    isLive: boolean;
    currentlyJoined: number;
    totalJoinedSoFar: number;
    rejoinsSoFar: number;
    lastEventAt: Date | null;
}
export interface ZoomLiveStatusV1 extends ZoomLiveStatus, PaginatedZoomAttendeeRowsV1 {
}
export interface ZoomAttendanceMarks {
    system: boolean;
    rm: boolean | null;
    coordinator: boolean | null;
    final: boolean | null;
}
export interface ZoomAttendeeRow {
    attendeeId: number;
    userId: number | null;
    registrationId: number | null;
    fullName: string | null;
    zoomDisplayName: string | null;
    email: string | null;
    mobile: string | null;
    rmContact: string | null;
    profileImage: string | null;
    joinedAt: Date | null;
    noOfDevices: number | null;
    dropoffCount: number;
    rejoinCount: number;
    lastDropoffAt: Date | null;
    lastRejoinedAt: Date | null;
    durationSeconds: number;
    preSessionDurationSeconds: number;
    attendance: ZoomAttendanceMarks;
    joinUrl: string | null;
    activationStatus: RegistrationOnlineSessionActivationStatus | null;
    sourceTag: {
        sourceType: GeneratedLinkSourceType;
        label: string | null;
    } | null;
    generatedLinkId: number | null;
}
export interface ZoomAttendeeQuery {
    page: number;
    limit: number;
    search?: string;
    kpiCategory?: SessionKpiCategory;
    kpiFilter?: SessionKpiFilter;
    systemAttendance?: AttendanceStatus;
    rmAttendance?: AttendanceStatus;
    coordinatorAttendance?: AttendanceStatus;
    finalAttendance?: AttendanceStatus;
    attendanceOutcome?: SessionKpiFilter[];
    userType?: UserTypeFilterValue[];
    generalOnly?: boolean;
    sortKey?: string;
    sortOrder?: 'ASC' | 'DESC';
}
export interface ZoomAttendeeQueryV1Input {
    page: number;
    limit: number;
    search?: string;
    filters?: {
        kpiCategory?: SessionKpiCategory;
        kpiFilter?: SessionKpiFilter;
        rmContact?: number;
        systemAttendance?: AttendanceStatus;
        rmAttendance?: AttendanceStatus;
        coordinatorAttendance?: AttendanceStatus;
        finalAttendance?: AttendanceStatus;
        attendanceOutcome?: SessionKpiFilter[];
        userType?: UserTypeFilterValue[];
        generalOnly?: boolean;
    };
    sortKey?: string;
    sortOrder?: 'ASC' | 'DESC';
}
export interface AnalyticsGeneralAttendeeQueryV1Input {
    page: number;
    limit: number;
    search?: string;
    kpiFilter?: SessionKpiFilter;
    attendanceOutcome?: SessionKpiFilter[];
    sortKey?: string;
    sortOrder?: 'ASC' | 'DESC';
}
export interface PaginatedZoomAttendeeRows {
    data: ZoomAttendeeRow[];
    total: number;
    page: number;
    limit: number;
}
export interface SessionKpiTile {
    label: string;
    value: number;
    kpiCategory?: SessionKpiCategory;
    kpiFilter?: SessionKpiFilter;
}
export interface ZoomSessionKpisV1 extends ZoomSessionKpis {
    kpis: SessionKpiTile[];
    sideFilterSets: SessionAttendeeFilterSets;
}
export interface ZoomGeneralAttendeeKpisV1 extends ZoomGeneralAttendeeKpis {
    kpis: SessionKpiTile[];
}
export interface SessionAttendeeTableHeader {
    key: string;
    label: string;
    sortable: boolean;
    filterable: boolean;
    type: 'string' | 'number' | 'date' | 'boolean';
}
export interface PaginatedZoomAttendeeRowsV1 extends PaginatedZoomAttendeeRows {
    tableHeaders: SessionAttendeeTableHeader[];
    appliedKpi: {
        kpiCategory: SessionKpiCategory;
        kpiFilter: SessionKpiFilter;
    } | null;
    kpis: SessionKpiTile[];
    isAttendanceLocked: boolean;
}
export interface GeneralAttendeeBulkCommunications {
    valueCard: SessionCommunicationStatusSummary | null;
}
export interface PaginatedZoomGeneralAttendeeRowsV1 extends PaginatedZoomAttendeeRowsV1 {
    communications: GeneralAttendeeBulkCommunications;
}
export interface SessionAttendeeSideFilterOption {
    label: string;
    value: string;
}
export interface SessionAttendeeSideFilter {
    key: string;
    label: string;
    type: 'dropdown' | 'checkbox';
    options: SessionAttendeeSideFilterOption[];
    excludeRoles?: string[];
}
export interface SessionAttendeeFilterSets {
    baseSets: Record<string, SessionAttendeeSideFilter[]>;
    contextualFilters: Record<string, string[]>;
}
export interface ZoomSessionAttendanceSummary {
    total: number;
    attended: number;
    absent: number;
    droppedOff: number;
    rejoined: number;
}
export interface ZoomJourneyPoint {
    bucketAt: Date;
    attended: number;
    absent: number;
    dropOff: number;
    rejoins: number;
    lateComers: number;
}
export interface ZoomDropOffBandSegment {
    reason: string;
    count: number;
}
export interface ZoomDropOffBand {
    label: string;
    segments: ZoomDropOffBandSegment[];
}
export interface ZoomDropOffAnalysis {
    total: number;
    reasons: string[];
    bands: ZoomDropOffBand[];
}
export interface ZoomSeekerSessionRow {
    sessionId: number;
    startsAt: Date | null;
    held: boolean;
    attended: boolean;
    joinedAt: Date | null;
    lateByMinutes: number | null;
    durationSeconds: number;
    deviceCount: number | null;
    dropoffCount: number;
    rejoinCount: number;
}
export interface ZoomRegistrationProfile {
    fullName: string | null;
    email: string | null;
    mobile: string | null;
    registrationSeqNumber: string | null;
    registeredDate: Date | null;
    gender: string | null;
    rmName: string | null;
}
export interface ZoomSeekerAnalytics {
    programId: number;
    registrationId: number;
    rmName: string | null;
    profile: ZoomRegistrationProfile | null;
    sessionsHeld: number;
    sessionsAttended: number;
    attendancePercent: number | null;
    totalLearningSeconds: number;
    eligibility: {
        thresholdSession: number;
        status: 'pending' | 'eligible' | 'not-eligible';
    };
    sessions: ZoomSeekerSessionRow[];
}
export interface ZoomMultipleLoginsBucket {
    label: string;
    count: number;
    percentage: number;
}
export interface ZoomMultipleLoginsBreakdown {
    total: number;
    buckets: ZoomMultipleLoginsBucket[];
}
export interface ZoomLateComerBucket {
    label: string;
    count: number;
}
export interface ZoomLateComerAnalysis {
    total: number;
    buckets: ZoomLateComerBucket[];
}
export interface ZoomSincerityMap {
    total: number;
    punctualityBandLabels: string[];
    enduranceBandLabels: string[];
    counts: number[][];
}
export interface ZoomSessionDashboard {
    sessionId: number;
    summary: ZoomSessionAttendanceSummary;
    journey: ZoomJourneyPoint[];
    dropOff: ZoomDropOffAnalysis;
    multipleLogins: ZoomMultipleLoginsBreakdown;
    lateComers: ZoomLateComerAnalysis;
    sincerityMap: ZoomSincerityMap;
    reconciledAt: Date | null;
}
export interface ZoomProgramAnalyticsKpis {
    totalAttendees: number;
    active: number;
    avgAttendancePercent: number | null;
    eligibleForNextSession: number;
    thresholdSession: number;
}
export interface ZoomProgramSessionKpiTiles {
    totalAttendees: number;
    present: number;
    absent: number;
    joinedLate: number;
}
export interface ZoomProgramCommsChecklistItem {
    purpose: string;
    label: string;
}
export interface ZoomProgramSessionTimelineEntry {
    sessionId: number;
    label: string;
    startsAt: Date | null;
    status: 'completed' | 'upcoming';
    kpis?: ZoomProgramSessionKpiTiles;
    commsChecklist?: ZoomProgramCommsChecklistItem[];
}
export interface ZoomProgramLatecomerColumn {
    sessionId: number;
    label: string;
    countsByBand: number[];
}
export interface ZoomProgramLatecomersMatrix {
    bandLabels: string[];
    columns: ZoomProgramLatecomerColumn[];
}
export type ZoomProgramRepeatLatecomerStatus = 'onTime' | 'late' | 'absent';
export interface ZoomProgramRepeatLatecomerRow {
    registrationId: number;
    seekerName: string;
    statuses: ZoomProgramRepeatLatecomerStatus[];
    lateCount: number;
    avgLateMinutes: number | null;
}
export interface ZoomProgramRepeatLatecomers {
    sessionLabels: string[];
    rows: ZoomProgramRepeatLatecomerRow[];
}
export interface ZoomProgramMultiDeviceColumn {
    sessionId: number;
    label: string;
    count: number;
}
export interface ZoomProgramMultiDeviceBreakdown {
    columns: ZoomProgramMultiDeviceColumn[];
}
export interface ZoomProgramOverallAnalytics {
    programId: number;
    kpis: ZoomProgramAnalyticsKpis;
    timeline: ZoomProgramSessionTimelineEntry[];
    latecomers: ZoomProgramLatecomersMatrix;
    repeatLatecomers: ZoomProgramRepeatLatecomers;
    multipleLogins: ZoomProgramMultiDeviceBreakdown;
}
export type ZoomFollowUpEngagement = 'LOW' | 'MEDIUM' | 'HIGH';
export interface ZoomFollowUpRow {
    attendeeId: number | null;
    registrationId: number;
    userId: number | null;
    fullName: string | null;
    email: string | null;
    mobile: string | null;
    joinedAt: Date | null;
    durationSeconds: number | null;
    deviceCount: number | null;
    rmName: string | null;
    reason: string;
    engagement: ZoomFollowUpEngagement;
}
export interface PaginatedZoomFollowUpRows {
    data: ZoomFollowUpRow[];
    total: number;
    page: number;
    limit: number;
}
