// Appointment Models export interface Appointment { id: string; first_name: string; last_name: string; email: string; phone?: string; reason?: string; preferred_dates: string[]; // YYYY-MM-DD format preferred_time_slots: string[]; // "morning", "afternoon", "evening" status: "pending_review" | "scheduled" | "rejected" | "completed"; created_at: string; updated_at: string; scheduled_datetime?: string; scheduled_duration?: number; rejection_reason?: string; jitsi_meet_url?: string; jitsi_room_id?: string; has_jitsi_meeting?: boolean; can_join_meeting?: boolean; meeting_status?: string; } export interface AppointmentResponse { appointment?: Appointment; message?: string; [key: string]: any; } export interface AppointmentsListResponse { appointments: Appointment[]; count?: number; next?: string | null; previous?: string | null; } export interface AvailableDatesResponse { dates: string[]; // YYYY-MM-DD format available_days?: number[]; // 0-6 (Monday-Sunday) available_days_display?: string[]; } export interface AdminAvailability { available_days: number[]; // 0-6 (Monday-Sunday) available_days_display: string[]; } export interface AppointmentStats { total_requests: number; pending_review: number; scheduled: number; rejected: number; completion_rate: number; users?: number; // Total users count from API } export interface UserAppointmentStats { total_requests: number; pending_review: number; scheduled: number; rejected: number; completed: number; completion_rate: number; } export interface JitsiMeetingInfo { meeting_url: string; room_id: string; scheduled_time: string; duration: string; can_join: boolean; meeting_status: string; join_instructions: string; } export interface ApiError { detail?: string | string[]; message?: string | string[]; error?: string; preferred_dates?: string[]; preferred_time_slots?: string[]; email?: string[]; first_name?: string[]; last_name?: string[]; [key: string]: string | string[] | undefined; }