/** * Event Controller Types * * Defines TypeScript types for the Event Management Controller */ import { EventEmitter } from "@uplink-protocol/core"; import { ControllerMetadata } from "@uplink-protocol/core/dist/uplink/interfaces/metadata/controller-metadata.interface"; import { CalendarEvent, CreateEventInput, UpdateEventInput, EventFilter, EventSort, EventResults, EventValidationResult } from '../interfaces/event.interfaces'; /** * Event Controller Bindings - Reactive state management */ export interface EventControllerBindings { /** Currently selected event */ selectedEvent: { get: () => CalendarEvent | null; set: (event: CalendarEvent | null) => void; }; /** All events list */ allEvents: { get: () => CalendarEvent[]; set: (events: CalendarEvent[]) => void; }; /** Filtered events */ filteredEvents: { get: () => CalendarEvent[]; set: (events: CalendarEvent[]) => void; }; /** Current filter */ currentFilter: { get: () => EventFilter | null; set: (filter: EventFilter | null) => void; }; /** Current sort */ currentSort: { get: () => EventSort | null; set: (sort: EventSort | null) => void; }; /** Search query */ searchQuery: { get: () => string; set: (query: string) => void; }; /** Search results */ searchResults: { get: () => CalendarEvent[]; set: (results: CalendarEvent[]) => void; }; /** Loading state */ isLoading: { get: () => boolean; set: (loading: boolean) => void; }; /** Error state */ error: { get: () => string | null; set: (error: string | null) => void; }; /** Total event count */ totalCount: { get: () => number; set: (count: number) => void; }; /** Current page */ currentPage: { get: () => number; set: (page: number) => void; }; /** Page size */ pageSize: { get: () => number; set: (size: number) => void; }; /** Events for current date range */ dateRangeEvents: { get: () => CalendarEvent[]; set: (events: CalendarEvent[]) => void; }; /** Current date range */ currentDateRange: { get: () => { start: Date; end: Date; } | null; set: (range: { start: Date; end: Date; } | null) => void; }; /** Upcoming events */ upcomingEvents: { get: () => CalendarEvent[]; set: (events: CalendarEvent[]) => void; }; /** Overdue events */ overdueEvents: { get: () => CalendarEvent[]; set: (events: CalendarEvent[]) => void; }; /** Event conflicts */ conflicts: { get: () => any[]; set: (conflicts: any[]) => void; }; /** Validation errors */ validationErrors: { get: () => string[]; set: (errors: string[]) => void; }; /** Sync status */ syncStatus: { get: () => 'idle' | 'syncing' | 'success' | 'error'; set: (status: 'idle' | 'syncing' | 'success' | 'error') => void; }; /** Last sync time */ lastSyncTime: { get: () => Date | null; set: (time: Date | null) => void; }; /** Available categories */ categories: { get: () => string[]; set: (categories: string[]) => void; }; /** Available tags */ tags: { get: () => string[]; set: (tags: string[]) => void; }; /** Statistics */ statistics: { get: () => any; set: (stats: any) => void; }; } /** * Event Controller Methods - Available operations */ export interface EventControllerMethods { createEvent: (input: CreateEventInput) => Promise; updateEvent: (input: UpdateEventInput) => Promise; deleteEvent: (id: string) => Promise; getEventById: (id: string) => Promise; getAllEvents: () => Promise; queryEvents: (filter?: EventFilter, sort?: EventSort, page?: number, pageSize?: number) => Promise; filterEvents: (filter: EventFilter) => Promise; sortEvents: (sort: EventSort) => Promise; searchEvents: (query: string, filters?: EventFilter) => Promise; getEventsForDate: (date: Date) => Promise; getEventsForDateRange: (start: Date, end: Date) => Promise; getEventsForWeek: (date: Date) => Promise; getEventsForMonth: (date: Date) => Promise; getUpcomingEvents: (limit?: number) => Promise; getOverdueEvents: () => Promise; bulkCreateEvents: (inputs: CreateEventInput[]) => Promise; bulkUpdateEvents: (inputs: UpdateEventInput[]) => Promise; bulkDeleteEvents: (ids: string[]) => Promise; validateEvent: (input: CreateEventInput | UpdateEventInput) => Promise; validateEventConstraints: (event: CalendarEvent) => Promise; duplicateEvent: (id: string, newDate?: Date) => Promise; moveEvent: (id: string, newStart: Date, newEnd?: Date) => Promise; rescheduleEvent: (id: string, newDateTime: { start: Date; end: Date; }) => Promise; cancelEvent: (id: string, reason?: string) => Promise; completeEvent: (id: string) => Promise; createRecurringEvent: (input: CreateEventInput, recurrence: any) => Promise; updateRecurringEvent: (id: string, updates: Partial, scope: 'this' | 'future' | 'all') => Promise; deleteRecurringEvent: (id: string, scope: 'this' | 'future' | 'all') => Promise; getRecurrenceOccurrences: (id: string, dateRange: { start: Date; end: Date; }) => Promise; checkConflicts: (event: CalendarEvent) => Promise; resolveConflict: (conflictId: string, resolution: any) => Promise; findAlternativeTimeSlots: (event: CalendarEvent, options: any) => Promise; getCategories: () => Promise; addCategory: (category: string) => Promise; removeCategory: (category: string) => Promise; getTags: () => Promise; addTag: (tag: string) => Promise; removeTag: (tag: string) => Promise; importEvents: (events: CalendarEvent[], options?: any) => Promise<{ imported: number; skipped: number; errors: string[]; }>; exportEvents: (filter?: EventFilter, format?: 'json' | 'ics' | 'csv') => Promise<{ data: string; filename: string; mimeType: string; }>; getStatistics: (dateRange?: { start: Date; end: Date; }) => Promise; getEventAnalytics: (dateRange: { start: Date; end: Date; }) => Promise; syncWithProvider: (providerId: string) => Promise; getSyncStatus: () => Promise; configureSyncProvider: (config: any) => Promise; scheduleReminder: (eventId: string, reminder: any) => Promise; cancelReminder: (eventId: string, reminderId: string) => Promise; saveSearch: (name: string, query: any) => Promise; getSavedSearches: () => Promise; executeSavedSearch: (searchId: string) => Promise; clearAllEvents: () => Promise; backup: () => Promise; restore: (backupData: string) => Promise; getHealth: () => Promise<{ status: string; details: any; }>; } /** * Event Controller Events - Event system for reactivity */ export interface EventControllerEvents { /** Event created */ eventCreated: EventEmitter; /** Event updated */ eventUpdated: EventEmitter<{ event: CalendarEvent; oldEvent: CalendarEvent; }>; /** Event deleted */ eventDeleted: EventEmitter<{ eventId: string; event: CalendarEvent; }>; /** Events loaded */ eventsLoaded: EventEmitter; /** Filter changed */ filterChanged: EventEmitter; /** Sort changed */ sortChanged: EventEmitter; /** Search performed */ searchPerformed: EventEmitter<{ query: string; results: CalendarEvent[]; }>; /** Event selected */ eventSelected: EventEmitter; /** Event deselected */ eventDeselected: EventEmitter; /** Validation failed */ validationFailed: EventEmitter; /** Conflict detected */ conflictDetected: EventEmitter; /** Conflict resolved */ conflictResolved: EventEmitter; /** Sync started */ syncStarted: EventEmitter<{ providerId: string; }>; /** Sync completed */ syncCompleted: EventEmitter<{ providerId: string; results: any; }>; /** Sync failed */ syncFailed: EventEmitter<{ providerId: string; error: string; }>; /** Bulk operation completed */ bulkOperationCompleted: EventEmitter<{ operation: string; count: number; }>; /** Loading state changed */ loadingChanged: EventEmitter; /** Error occurred */ errorOccurred: EventEmitter; /** Statistics updated */ statisticsUpdated: EventEmitter; /** Recurrence created */ recurrenceCreated: EventEmitter; /** Reminder scheduled */ reminderScheduled: EventEmitter<{ eventId: string; reminder: any; }>; /** Category added */ categoryAdded: EventEmitter; /** Tag added */ tagAdded: EventEmitter; } /** * Event Controller Options - Configuration */ export interface EventControllerOptions { /** Default page size for queries */ defaultPageSize?: number; /** Enable automatic conflict detection */ autoConflictDetection?: boolean; /** Enable automatic validation */ autoValidation?: boolean; /** Storage configuration */ storage?: { type: 'memory' | 'localStorage' | 'indexedDB' | 'external'; options?: Record; }; /** Default date range for queries */ defaultDateRange?: { pastDays: number; futureDays: number; }; /** Enable search indexing */ enableSearch?: boolean; /** Enable notifications */ enableNotifications?: boolean; /** Enable sync */ enableSync?: boolean; /** Locale for formatting */ locale?: string; /** Time zone */ timeZone?: string; /** Working hours */ workingHours?: { start: string; end: string; days: number[]; }; /** Custom validation rules */ customValidationRules?: any[]; /** Event defaults */ eventDefaults?: Partial; } /** * Typed Event Controller Interface */ export interface TypedEventController { /** Reactive bindings */ bindings: EventControllerBindings; /** Available methods */ methods: EventControllerMethods; /** Event emitters */ events: EventControllerEvents; /** Controller metadata */ meta?: ControllerMetadata; /** Controller options */ options?: EventControllerOptions; } /** * Event Controller Instance - Runtime interface */ export interface EventControllerInstance extends TypedEventController { /** Initialize the controller */ initialize(options?: EventControllerOptions): Promise; /** Get controller status */ getStatus(): { initialized: boolean; totalEvents: number; health: 'good' | 'warning' | 'error'; lastError?: string; }; /** Destroy the controller */ destroy(): Promise; }