import { CalendarConnection } from '../../models/entities/CalendarConnection.entity';
import { Booking } from '../../models/entities/Booking.entity';
import { EventType } from '../../models/entities/EventType.entity';

export interface ExternalCalendar {
  externalId: string;
  name: string;
}

export interface BusyInterval {
  start: Date;
  end: Date;
}

export interface ExternalCalendarEvent {
  id: string;
  title: string;
  start: Date;
  end: Date;
  calendarId: string;
  allDay?: boolean;
}

export interface TokenPair {
  accessToken: string;
  refreshToken?: string;
  expiresAt?: Date;
}

export interface CalendarProvider {
  listCalendars(connection: CalendarConnection): Promise<ExternalCalendar[]>;
  getFreeBusy(connection: CalendarConnection, from: Date, to: Date): Promise<BusyInterval[]>;
  /** Optional: titled events for host calendar UI (Google/Microsoft). */
  listEvents?(
    connection: CalendarConnection,
    from: Date,
    to: Date,
    calendarId?: string,
  ): Promise<ExternalCalendarEvent[]>;
  createEvent(connection: CalendarConnection, booking: Booking, eventType: EventType): Promise<{ eventId: string; calendarId: string }>;
  updateEvent(connection: CalendarConnection, calendarId: string, eventId: string, booking: Booking, eventType: EventType): Promise<void>;
  deleteEvent(connection: CalendarConnection, calendarId: string, eventId: string): Promise<void>;
  refreshToken(connection: CalendarConnection): Promise<TokenPair>;
  revokeToken?(connection: CalendarConnection): Promise<void>;
}
