import { BaseDomainEvent } from '../../shared/events/BaseDomainEvent';
import { AppointmentId } from '../value-objects/AppointmentId';
import { TenantId } from '../../tenant/value-objects/TenantId';
import { UserId } from '../../user/value-objects/UserId';
import { Appointment } from '../entities/Appointment';
/**
 * Base interface for all appointment domain events
 */
export interface AppointmentDomainEvent extends BaseDomainEvent {
    appointmentId: AppointmentId;
    tenantId: TenantId;
}
/**
 * Event fired when a new appointment is scheduled
 */
export interface AppointmentScheduledEvent extends AppointmentDomainEvent {
    eventType: 'AppointmentScheduled';
    data: {
        appointment: Appointment;
        scheduledBy: UserId;
        schedulingMethod: 'online' | 'phone' | 'in_person' | 'mobile_app' | 'referral';
        source?: string;
        previousAppointmentId?: AppointmentId;
    };
}
/**
 * Event fired when an appointment is confirmed
 */
export interface AppointmentConfirmedEvent extends AppointmentDomainEvent {
    eventType: 'AppointmentConfirmed';
    data: {
        appointment: Appointment;
        confirmedBy: UserId;
        confirmationMethod: 'email' | 'sms' | 'phone' | 'in_person' | 'auto';
        confirmationNotes?: string;
    };
}
/**
 * Event fired when a patient checks in for an appointment
 */
export interface AppointmentCheckedInEvent extends AppointmentDomainEvent {
    eventType: 'AppointmentCheckedIn';
    data: {
        appointment: Appointment;
        checkedInBy: UserId;
        checkInTime: Date;
        waitTime?: number;
        location?: string;
        notes?: string;
    };
}
/**
 * Event fired when an appointment starts
 */
export interface AppointmentStartedEvent extends AppointmentDomainEvent {
    eventType: 'AppointmentStarted';
    data: {
        appointment: Appointment;
        startedBy: UserId;
        startTime: Date;
        actualStartTime: Date;
        delayReason?: string;
        notes?: string;
    };
}
/**
 * Event fired when an appointment is completed
 */
export interface AppointmentCompletedEvent extends AppointmentDomainEvent {
    eventType: 'AppointmentCompleted';
    data: {
        appointment: Appointment;
        completedBy: UserId;
        completionTime: Date;
        actualDuration: number;
        diagnosis?: string;
        treatmentPlan?: string;
        followUpRequired: boolean;
        followUpDate?: Date;
        notes?: string;
    };
}
/**
 * Event fired when an appointment is cancelled
 */
export interface AppointmentCancelledEvent extends AppointmentDomainEvent {
    eventType: 'AppointmentCancelled';
    data: {
        appointment: Appointment;
        cancelledBy: UserId;
        cancellationTime: Date;
        cancellationReason: string;
        cancellationFee?: number;
        refundAmount?: number;
        rescheduleOffered: boolean;
        rescheduleDate?: Date;
        notes?: string;
    };
}
/**
 * Event fired when a patient is a no-show
 */
export interface AppointmentNoShowEvent extends AppointmentDomainEvent {
    eventType: 'AppointmentNoShow';
    data: {
        appointment: Appointment;
        recordedBy: UserId;
        noShowTime: Date;
        noShowReason?: string;
        noShowFee?: number;
        rescheduleOffered: boolean;
        rescheduleDate?: Date;
        notes?: string;
    };
}
/**
 * Event fired when an appointment is rescheduled
 */
export interface AppointmentRescheduledEvent extends AppointmentDomainEvent {
    eventType: 'AppointmentRescheduled';
    data: {
        appointment: Appointment;
        rescheduledBy: UserId;
        originalDate: Date;
        newDate: Date;
        rescheduleReason: string;
        rescheduleFee?: number;
        approvalRequired: boolean;
        approvedBy?: UserId;
        approvalDate?: Date;
        notes?: string;
    };
}
/**
 * Event fired when an appointment is put on hold
 */
export interface AppointmentOnHoldEvent extends AppointmentDomainEvent {
    eventType: 'AppointmentOnHold';
    data: {
        appointment: Appointment;
        putOnHoldBy: UserId;
        holdTime: Date;
        holdReason: string;
        estimatedResumeTime?: Date;
        notes?: string;
    };
}
/**
 * Event fired when an appointment reminder is sent
 */
export interface AppointmentReminderSentEvent extends AppointmentDomainEvent {
    eventType: 'AppointmentReminderSent';
    data: {
        appointment: Appointment;
        reminderSentBy: UserId;
        reminderTime: Date;
        reminderMethod: 'email' | 'sms' | 'phone' | 'push_notification' | 'mail';
        reminderAdvanceTime: number;
        recipientType: 'patient' | 'guardian' | 'doctor' | 'nurse';
        reminderMessage?: string;
        deliveryStatus: 'sent' | 'delivered' | 'failed';
        notes?: string;
    };
}
/**
 * Event fired when appointment insurance information is updated
 */
export interface AppointmentInsuranceUpdatedEvent extends AppointmentDomainEvent {
    eventType: 'AppointmentInsuranceUpdated';
    data: {
        appointment: Appointment;
        updatedBy: UserId;
        oldInsurance?: {
            providerName: string;
            policyNumber: string;
        };
        newInsurance: {
            providerName: string;
            policyNumber: string;
            effectiveDate: Date;
        };
        reason?: string;
        preAuthorizationRequired: boolean;
        preAuthorizationNumber?: string;
    };
}
/**
 * Event fired when appointment billing information is updated
 */
export interface AppointmentBillingUpdatedEvent extends AppointmentDomainEvent {
    eventType: 'AppointmentBillingUpdated';
    data: {
        appointment: Appointment;
        updatedBy: UserId;
        billingChanges: {
            field: string;
            oldValue?: unknown;
            newValue: unknown;
        }[];
        paymentMethodUpdated?: boolean;
        billingStatusChanged?: boolean;
        reason?: string;
    };
}
/**
 * Event fired when appointment quality metrics are recorded
 */
export interface AppointmentQualityMetricsRecordedEvent extends AppointmentDomainEvent {
    eventType: 'AppointmentQualityMetricsRecorded';
    data: {
        appointment: Appointment;
        recordedBy: UserId;
        qualityMetrics: {
            waitTime: number;
            consultationTime: number;
            patientArrivalTime: Date;
            doctorArrivalTime: Date;
            treatmentEffectiveness: string;
            patientCompliance: string;
            followUpCompliance: boolean;
            readmissionRisk: string;
        };
        recordingDate: Date;
        notes?: string;
    };
}
/**
 * Event fired when patient satisfaction survey is completed
 */
export interface AppointmentSatisfactionSurveyCompletedEvent extends AppointmentDomainEvent {
    eventType: 'AppointmentSatisfactionSurveyCompleted';
    data: {
        appointment: Appointment;
        surveyCompletedBy: UserId;
        surveyDate: Date;
        satisfactionScores: {
            overallRating: number;
            waitTimeRating: number;
            doctorRating: number;
            nurseRating: number;
            facilityRating: number;
            communicationRating: number;
            treatmentEffectivenessRating: number;
        };
        wouldRecommend: boolean;
        comments?: string;
        followUpRequired: boolean;
    };
}
/**
 * Event fired when appointment location is changed
 */
export interface AppointmentLocationChangedEvent extends AppointmentDomainEvent {
    eventType: 'AppointmentLocationChanged';
    data: {
        appointment: Appointment;
        changedBy: UserId;
        oldLocation: {
            name: string;
            type: string;
            address: string;
        };
        newLocation: {
            name: string;
            type: string;
            address: string;
        };
        changeReason: string;
        changeDate: Date;
        notes?: string;
    };
}
/**
 * Event fired when appointment participants are updated
 */
export interface AppointmentParticipantsUpdatedEvent extends AppointmentDomainEvent {
    eventType: 'AppointmentParticipantsUpdated';
    data: {
        appointment: Appointment;
        updatedBy: UserId;
        participantChanges: {
            participantType: 'doctor' | 'nurse' | 'specialist';
            oldParticipantId?: UserId;
            newParticipantId: UserId;
        }[];
        reason?: string;
        notes?: string;
    };
}
/**
 * Event fired when appointment medical information is updated
 */
export interface AppointmentMedicalInfoUpdatedEvent extends AppointmentDomainEvent {
    eventType: 'AppointmentMedicalInfoUpdated';
    data: {
        appointment: Appointment;
        updatedBy: UserId;
        medicalInfoChanges: {
            field: string;
            oldValue?: unknown;
            newValue: unknown;
        }[];
        diagnosisUpdated?: boolean;
        treatmentPlanUpdated?: boolean;
        followUpRequiredChanged?: boolean;
        reason?: string;
        notes?: string;
    };
}
/**
 * Event fired when appointment reminder settings are updated
 */
export interface AppointmentReminderSettingsUpdatedEvent extends AppointmentDomainEvent {
    eventType: 'AppointmentReminderSettingsUpdated';
    data: {
        appointment: Appointment;
        updatedBy: UserId;
        reminderSettingChanges: {
            setting: string;
            oldValue: unknown;
            newValue: unknown;
        }[];
        reason?: string;
        notes?: string;
    };
}
/**
 * Event fired when appointment cancellation policy is updated
 */
export interface AppointmentCancellationPolicyUpdatedEvent extends AppointmentDomainEvent {
    eventType: 'AppointmentCancellationPolicyUpdated';
    data: {
        appointment: Appointment;
        updatedBy: UserId;
        policyChanges: {
            field: string;
            oldValue: unknown;
            newValue: unknown;
        }[];
        reason?: string;
        notes?: string;
    };
}
/**
 * Union type for all appointment domain events
 */
export type AppointmentEvent = AppointmentScheduledEvent | AppointmentConfirmedEvent | AppointmentCheckedInEvent | AppointmentStartedEvent | AppointmentCompletedEvent | AppointmentCancelledEvent | AppointmentNoShowEvent | AppointmentRescheduledEvent | AppointmentOnHoldEvent | AppointmentReminderSentEvent | AppointmentInsuranceUpdatedEvent | AppointmentBillingUpdatedEvent | AppointmentQualityMetricsRecordedEvent | AppointmentSatisfactionSurveyCompletedEvent | AppointmentLocationChangedEvent | AppointmentParticipantsUpdatedEvent | AppointmentMedicalInfoUpdatedEvent | AppointmentReminderSettingsUpdatedEvent | AppointmentCancellationPolicyUpdatedEvent;
/**
 * Factory functions for creating appointment domain events
 */
export declare const AppointmentEventFactory: {
    /**
     * Create an AppointmentScheduledEvent
     */
    createAppointmentScheduledEvent(appointment: Appointment, scheduledBy: UserId, schedulingMethod: "online" | "phone" | "in_person" | "mobile_app" | "referral", source?: string, previousAppointmentId?: AppointmentId): AppointmentScheduledEvent;
    /**
     * Create an AppointmentConfirmedEvent
     */
    createAppointmentConfirmedEvent(appointment: Appointment, confirmedBy: UserId, confirmationMethod: "email" | "sms" | "phone" | "in_person" | "auto", confirmationNotes?: string): AppointmentConfirmedEvent;
    /**
     * Create an AppointmentCancelledEvent
     */
    createAppointmentCancelledEvent(appointment: Appointment, cancelledBy: UserId, cancellationReason: string, cancellationFee?: number, refundAmount?: number, rescheduleOffered?: boolean, rescheduleDate?: Date, notes?: string): AppointmentCancelledEvent;
};
/**
 * Type guard to check if an event is an AppointmentScheduledEvent
 */
export declare function isAppointmentScheduledEvent(event: AppointmentEvent): event is AppointmentScheduledEvent;
/**
 * Type guard to check if an event is an AppointmentConfirmedEvent
 */
export declare function isAppointmentConfirmedEvent(event: AppointmentEvent): event is AppointmentConfirmedEvent;
/**
 * Type guard to check if an event is an AppointmentCancelledEvent
 */
export declare function isAppointmentCancelledEvent(event: AppointmentEvent): event is AppointmentCancelledEvent;
/**
 * Type guard to check if an event is an AppointmentDomainEvent
 */
export declare function isAppointmentDomainEvent(event: unknown): event is AppointmentDomainEvent;
//# sourceMappingURL=AppointmentDomainEvent.d.ts.map