import { BaseDomainEvent } from '../../shared/events/BaseDomainEvent';
import { PatientId } from '../value-objects/PatientId';
import { TenantId } from '../../tenant/value-objects/TenantId';
import { UserId } from '../../user/value-objects/UserId';
import { Patient } from '../entities/Patient';
import { PatientStatus } from '../enums/PatientStatus';
/**
 * Base interface for all patient domain events
 */
export interface PatientDomainEvent extends BaseDomainEvent {
    patientId: PatientId;
    tenantId: TenantId;
}
/**
 * Event fired when a new patient is registered
 */
export interface PatientRegisteredEvent extends PatientDomainEvent {
    eventType: 'PatientRegistered';
    data: {
        patient: Patient;
        registeredBy: UserId;
        registrationMethod: 'online' | 'in_person' | 'phone' | 'referral';
        source?: string;
    };
}
/**
 * Event fired when a patient's information is updated
 */
export interface PatientUpdatedEvent extends PatientDomainEvent {
    eventType: 'PatientUpdated';
    data: {
        patient: Patient;
        updatedBy: UserId;
        changes: {
            field: string;
            oldValue: unknown;
            newValue: unknown;
        }[];
        updateReason?: string;
    };
}
/**
 * Event fired when a patient's status changes
 */
export interface PatientStatusChangedEvent extends PatientDomainEvent {
    eventType: 'PatientStatusChanged';
    data: {
        patient: Patient;
        oldStatus: PatientStatus;
        newStatus: PatientStatus;
        changedBy: UserId;
        reason?: string;
        effectiveDate: Date;
    };
}
/**
 * Event fired when a patient is assigned to a doctor
 */
export interface PatientAssignedToDoctorEvent extends PatientDomainEvent {
    eventType: 'PatientAssignedToDoctor';
    data: {
        patient: Patient;
        doctorId: UserId;
        assignedBy: UserId;
        assignmentDate: Date;
        reason?: string;
        previousDoctorId?: UserId;
    };
}
/**
 * Event fired when a patient is discharged
 */
export interface PatientDischargedEvent extends PatientDomainEvent {
    eventType: 'PatientDischarged';
    data: {
        patient: Patient;
        dischargedBy: UserId;
        dischargeDate: Date;
        dischargeReason: string;
        dischargeSummary?: string;
        followUpInstructions?: string;
        followUpDate?: Date;
    };
}
/**
 * Event fired when a patient is transferred to another facility
 */
export interface PatientTransferredEvent extends PatientDomainEvent {
    eventType: 'PatientTransferred';
    data: {
        patient: Patient;
        transferredBy: UserId;
        transferDate: Date;
        destinationFacility: string;
        transferReason: string;
        transferNotes?: string;
        contactInformation?: {
            facilityName: string;
            contactPerson: string;
            phoneNumber: string;
            email?: string;
        };
    };
}
/**
 * Event fired when a patient's medical history is updated
 */
export interface PatientMedicalHistoryUpdatedEvent extends PatientDomainEvent {
    eventType: 'PatientMedicalHistoryUpdated';
    data: {
        patient: Patient;
        updatedBy: UserId;
        updateType: 'allergy_added' | 'allergy_removed' | 'medication_added' | 'medication_removed' | 'condition_added' | 'condition_updated';
        medicalRecordId: string;
        changes: {
            field: string;
            oldValue?: unknown;
            newValue: unknown;
        }[];
        notes?: string;
    };
}
/**
 * Event fired when a patient's insurance information is updated
 */
export interface PatientInsuranceUpdatedEvent extends PatientDomainEvent {
    eventType: 'PatientInsuranceUpdated';
    data: {
        patient: Patient;
        updatedBy: UserId;
        insuranceType: 'primary' | 'secondary';
        oldInsurance?: {
            providerName: string;
            policyNumber: string;
        };
        newInsurance: {
            providerName: string;
            policyNumber: string;
            effectiveDate: Date;
        };
        reason?: string;
    };
}
/**
 * Event fired when a patient's billing information is updated
 */
export interface PatientBillingUpdatedEvent extends PatientDomainEvent {
    eventType: 'PatientBillingUpdated';
    data: {
        patient: Patient;
        updatedBy: UserId;
        billingChanges: {
            field: string;
            oldValue?: unknown;
            newValue: unknown;
        }[];
        paymentMethodUpdated?: boolean;
        outstandingBalanceChanged?: boolean;
        reason?: string;
    };
}
/**
 * Event fired when a patient's privacy settings are updated
 */
export interface PatientPrivacySettingsUpdatedEvent extends PatientDomainEvent {
    eventType: 'PatientPrivacySettingsUpdated';
    data: {
        patient: Patient;
        updatedBy: UserId;
        settingChanges: {
            setting: string;
            oldValue: boolean;
            newValue: boolean;
        }[];
        reason?: string;
        complianceNotes?: string;
    };
}
/**
 * Event fired when a patient's consent is recorded
 */
export interface PatientConsentRecordedEvent extends PatientDomainEvent {
    eventType: 'PatientConsentRecorded';
    data: {
        patient: Patient;
        recordedBy: UserId;
        consentType: string;
        procedureName: string;
        consentDate: Date;
        expiresDate?: Date;
        signedBy: string;
        witnessName?: string;
        consentFormId?: string;
        notes?: string;
    };
}
/**
 * Event fired when a patient's preferences are updated
 */
export interface PatientPreferencesUpdatedEvent extends PatientDomainEvent {
    eventType: 'PatientPreferencesUpdated';
    data: {
        patient: Patient;
        updatedBy: UserId;
        preferenceChanges: {
            category: string;
            field: string;
            oldValue?: unknown;
            newValue: unknown;
        }[];
        reason?: string;
    };
}
/**
 * Event fired when a patient's emergency contact is updated
 */
export interface PatientEmergencyContactUpdatedEvent extends PatientDomainEvent {
    eventType: 'PatientEmergencyContactUpdated';
    data: {
        patient: Patient;
        updatedBy: UserId;
        contactChanges: {
            contactType: 'primary' | 'secondary';
            oldContact?: {
                name: string;
                relationship: string;
                phoneNumber: string;
            };
            newContact: {
                name: string;
                relationship: string;
                phoneNumber: string;
                email?: string;
                address?: string;
            };
        }[];
        reason?: string;
    };
}
/**
 * Event fired when a patient's vital signs are recorded
 */
export interface PatientVitalSignsRecordedEvent extends PatientDomainEvent {
    eventType: 'PatientVitalSignsRecorded';
    data: {
        patient: Patient;
        recordedBy: UserId;
        vitalSigns: {
            temperature?: number;
            bloodPressure?: {
                systolic: number;
                diastolic: number;
            };
            heartRate?: number;
            respiratoryRate?: number;
            oxygenSaturation?: number;
            height?: number;
            weight?: number;
            bmi?: number;
        };
        recordingDate: Date;
        location?: string;
        notes?: string;
    };
}
/**
 * Event fired when a patient's medication is prescribed
 */
export interface PatientMedicationPrescribedEvent extends PatientDomainEvent {
    eventType: 'PatientMedicationPrescribed';
    data: {
        patient: Patient;
        prescribedBy: UserId;
        medication: {
            name: string;
            dosage: string;
            frequency: string;
            startDate: Date;
            endDate?: Date;
            instructions?: string;
        };
        prescriptionId: string;
        pharmacy?: string;
        notes?: string;
    };
}
/**
 * Event fired when a patient's medication is discontinued
 */
export interface PatientMedicationDiscontinuedEvent extends PatientDomainEvent {
    eventType: 'PatientMedicationDiscontinued';
    data: {
        patient: Patient;
        discontinuedBy: UserId;
        medication: {
            name: string;
            originalPrescriptionId: string;
        };
        discontinuationDate: Date;
        reason: string;
        notes?: string;
    };
}
/**
 * Event fired when a patient's allergy is recorded
 */
export interface PatientAllergyRecordedEvent extends PatientDomainEvent {
    eventType: 'PatientAllergyRecorded';
    data: {
        patient: Patient;
        recordedBy: UserId;
        allergy: {
            allergen: string;
            severity: string;
            reaction: string;
            onsetDate?: Date;
        };
        allergyId: string;
        notes?: string;
    };
}
/**
 * Event fired when a patient's immunization is recorded
 */
export interface PatientImmunizationRecordedEvent extends PatientDomainEvent {
    eventType: 'PatientImmunizationRecorded';
    data: {
        patient: Patient;
        recordedBy: UserId;
        immunization: {
            vaccineName: string;
            administrationDate: Date;
            nextDueDate?: Date;
            lotNumber?: string;
        };
        immunizationId: string;
        location: string;
        notes?: string;
    };
}
/**
 * Event fired when a patient's lab result is recorded
 */
export interface PatientLabResultRecordedEvent extends PatientDomainEvent {
    eventType: 'PatientLabResultRecorded';
    data: {
        patient: Patient;
        recordedBy: UserId;
        labResult: {
            testName: string;
            testDate: Date;
            result: string;
            normalRange?: string;
            units?: string;
            isAbnormal: boolean;
        };
        labResultId: string;
        lab: string;
        orderingPhysician: string;
        notes?: string;
    };
}
/**
 * Event fired when a patient's imaging result is recorded
 */
export interface PatientImagingResultRecordedEvent extends PatientDomainEvent {
    eventType: 'PatientImagingResultRecorded';
    data: {
        patient: Patient;
        recordedBy: UserId;
        imagingResult: {
            imagingType: string;
            studyDate: Date;
            report: string;
            isAbnormal: boolean;
            followUpRequired: boolean;
        };
        imagingResultId: string;
        facility: string;
        radiologist: string;
        notes?: string;
    };
}
/**
 * Union type for all patient domain events
 */
export type PatientEvent = PatientRegisteredEvent | PatientUpdatedEvent | PatientStatusChangedEvent | PatientAssignedToDoctorEvent | PatientDischargedEvent | PatientTransferredEvent | PatientMedicalHistoryUpdatedEvent | PatientInsuranceUpdatedEvent | PatientBillingUpdatedEvent | PatientPrivacySettingsUpdatedEvent | PatientConsentRecordedEvent | PatientPreferencesUpdatedEvent | PatientEmergencyContactUpdatedEvent | PatientVitalSignsRecordedEvent | PatientMedicationPrescribedEvent | PatientMedicationDiscontinuedEvent | PatientAllergyRecordedEvent | PatientImmunizationRecordedEvent | PatientLabResultRecordedEvent | PatientImagingResultRecordedEvent;
/**
 * Factory functions for creating patient domain events
 */
export declare const PatientEventFactory: {
    /**
     * Create a PatientRegisteredEvent
     */
    createPatientRegisteredEvent(patient: Patient, registeredBy: UserId, registrationMethod: "online" | "in_person" | "phone" | "referral", source?: string): PatientRegisteredEvent;
    /**
     * Create a PatientUpdatedEvent
     */
    createPatientUpdatedEvent(patient: Patient, updatedBy: UserId, changes: {
        field: string;
        oldValue: unknown;
        newValue: unknown;
    }[], updateReason?: string): PatientUpdatedEvent;
    /**
     * Create a PatientStatusChangedEvent
     */
    createPatientStatusChangedEvent(patient: Patient, oldStatus: PatientStatus, newStatus: PatientStatus, changedBy: UserId, reason?: string): PatientStatusChangedEvent;
};
/**
 * Type guard to check if an event is a PatientRegisteredEvent
 */
export declare function isPatientRegisteredEvent(event: PatientEvent): event is PatientRegisteredEvent;
/**
 * Type guard to check if an event is a PatientUpdatedEvent
 */
export declare function isPatientUpdatedEvent(event: PatientEvent): event is PatientUpdatedEvent;
/**
 * Type guard to check if an event is a PatientStatusChangedEvent
 */
export declare function isPatientStatusChangedEvent(event: PatientEvent): event is PatientStatusChangedEvent;
/**
 * Type guard to check if an event is a PatientDomainEvent
 */
export declare function isPatientDomainEvent(event: unknown): event is PatientDomainEvent;
//# sourceMappingURL=PatientDomainEvent.d.ts.map