import { Subset } from '../utils.js';
import { NylasApiErrorResponseData } from './error.js';
import { ListQueryParams } from './listQueryParams.js';
import { NylasBaseResponse } from './response.js';
/**
 * Interface representing a Nylas Event object.
 */
export interface Event {
    /**
     * Globally unique object identifier.
     */
    id: string;
    /**
     * Grant ID of the Nylas account.
     */
    grantId: string;
    /**
     * The type of object.
     */
    object: 'event';
    /**
     * Calendar ID of the event.
     */
    calendarId: string;
    /**
     * This value determines whether to show this event's time block as available on shared or public calendars.
     */
    busy: boolean;
    /**
     * If the event participants are able to edit the event.
     */
    readOnly: boolean;
    /**
     * List of participants invited to the event. Participants may also be rooms or resources.
     */
    participants: Participant[];
    /**
     * Representation of time and duration for events. When object can be in one of four formats (sub-objects):
     * - {@link Date}
     * - {@link Datespan}
     * - {@link Time}
     * - {@link Timespan}
     */
    when: When;
    /**
     * Representation of conferencing details for events. Conferencing object can be in one of two formats (sub-objects):
     * - {@link Autocreate}
     * - {@link Details}
     */
    conferencing: Conferencing;
    /**
     * Visibility of the event, if the event is private or public.
     */
    visibility: Visibility;
    /**
     * Description of the event.
     */
    description?: string;
    /**
     * Location of the event, such as a physical address or meeting room name.
     */
    location?: string;
    /**
     * Unique id for iCalendar standard, for identifying events across calendaring systems.
     * Recurring events may share the same value. Can be null for events synced before the year 2020.
     */
    icalUid?: string;
    /**
     * Title of the event.
     */
    title?: string;
    /**
     * A link to this event in the provider's UI
     */
    htmlLink?: string;
    /**
     * Whether participants of the event should be hidden.
     */
    hideParticipants?: boolean;
    /**
     * List of key-value pairs storing additional data.
     */
    metadata?: Record<string, string>;
    /**
     * User who created the event.
     * Not supported for all providers.
     */
    creator?: EmailName;
    /**
     * Organizer of the event.
     */
    organizer?: EmailName;
    /**
     * An list of RRULE and EXDATE strings.
     * @see <a href="https://datatracker.ietf.org/doc/html/rfc5545#section-3.8.5">RFC-5545</a>
     */
    recurrence?: string[];
    /**
     * A list of reminders to send for the event. If left empty or omitted, the event uses the provider defaults.
     */
    reminders?: Reminders;
    /**
     * Status of the event.
     */
    status?: Status;
    /**
     * Unix timestamp when the event was created.
     */
    createdAt?: number;
    /**
     * Unix timestamp when the event was last updated.
     */
    updatedAt?: number;
    /**
     * Master event id if recurring events.
     */
    masterEventId?: string;
}
/**
 * Interface representing a request to create an event.
 */
export interface CreateEventRequest {
    /**
     * Representation of time and duration for events. When object can be in one of four formats (sub-objects):
     * - {@link Date}
     * - {@link Datespan}
     * - {@link Time}
     * - {@link Timespan}
     */
    when: CreateWhen;
    /**
     * Title of the event.
     */
    title?: string;
    /**
     * This value determines whether to show this event's time block as available on shared or public calendars.
     */
    busy?: boolean;
    /**
     * Description of the event.
     */
    description?: string;
    /**
     * Location of the event, such as a physical address or meeting room name.
     */
    location?: string;
    /**
     * Representation of conferencing details for events. Conferencing object can be in one of two formats (sub-objects):
     * - {@link Autocreate}
     * - {@link Details}
     */
    conferencing?: Conferencing;
    /**
     * A list of reminders to send for the event. If left empty or omitted, the event uses the provider defaults.
     */
    reminders?: Reminders;
    /**
     *  A list of key-value pairs storing additional data.
     */
    metadata?: Record<string, unknown>;
    /**
     * List of participants invited to the event. Participants may also be rooms or resources.
     */
    participants?: Participant[];
    /**
     * An list of RRULE and EXDATE strings.
     * @see <a href="https://datatracker.ietf.org/doc/html/rfc5545#section-3.8.5">RFC-5545</a>
     */
    recurrence?: string[];
    /**
     * Calendar ID of the event.
     */
    calendarId?: string;
    /**
     * If the event participants are able to edit the event.
     */
    readOnly?: boolean;
    /**
     * Visibility of the event, if the event is private or public.
     */
    visibility?: 'public' | 'private';
    /**
     * The maximum number of participants that may attend the event.
     */
    capacity?: number;
    /**
     * Whether participants of the event should be hidden.
     */
    hideParticipants?: boolean;
}
/**
 * Interface representing a request to update an event.
 */
export type UpdateEventRequest = Subset<CreateEventRequest>;
/**
 * Interface representing a request to send RSVP to an event.
 */
export type SendRsvpRequest = {
    status: RsvpStatus;
};
/**
 * Interface representing the response from sending RSVP to an event.
 * @property sendIcsError If the send-rsvp request succeeded but the ICS email could not be sent, this will contain the error.
 */
export interface SendRsvpResponse extends NylasBaseResponse {
    sendIcsError?: NylasApiErrorResponseData;
}
/**
 * Interface representing the query parameters for listing events.
 */
export interface ListEventQueryParams extends ListQueryParams {
    /**
     * Return events that have a status of cancelled.
     * If an event is recurring, then it returns no matter the value set.
     * Different providers have different semantics for cancelled events.
     */
    showCancelled?: boolean;
    /**
     * Specify calendar ID of the event. "primary" is a supported value indicating the user's primary calendar.
     */
    calendarId: string;
    /**
     * Return events matching the specified title.
     */
    title?: string;
    /**
     * Return events matching the specified description.
     * Graph: NOT supported
     */
    description?: string;
    /**
     * Return events matching the specified location.
     */
    location?: string;
    /**
     * Return events ending before the specified unix timestamp.
     * Defaults to a month from now. Not respected by metadata filtering.
     */
    end?: string;
    /**
     * Return events starting after the specified unix timestamp.
     * Defaults to the current timestamp. Not respected by metadata filtering.
     */
    start?: string;
    /**
     * Pass in your metadata key and value pair to search for metadata.
     */
    metadataPair?: Record<string, unknown>;
    /**
     * If true, the response will include an event for each occurrence of a recurring event within the requested time range.
     * If false, only a single primary event will be returned for each recurring event.
     * Cannot be used when filtering on metadata.
     * Defaults to false.
     */
    expandRecurring?: boolean;
    /**
     * Returns events with a busy status of true.
     */
    busy?: boolean;
    /**
     * Order results by the specified field.
     * Currently only start is supported.
     */
    orderBy?: string;
    /**
     * The maximum number of objects to return.
     * This field defaults to 50. The maximum allowed value is 200.
     */
    limit?: number;
    /**
     * An identifier that specifies which page of data to return.
     * This value should be taken from the {@link NylasListResponse.nextCursor} response field.
     */
    pageToken?: string;
    /**
     * (Google only) Filter events by event type.
     * You can pass the query parameter multiple times to select or exclude multiple event types.
     */
    eventType?: EventType[];
    /**
     * Filter for events that include the specified attendees.
     * Not supported for virtual calendars.
     */
    attendees?: string[];
    /**
     * Master event id if recurring events.
     */
    masterEventId?: string;
}
/**
 * Interface representing of the query parameters for creating an event.
 */
export interface CreateEventQueryParams {
    /**
     * The ID of the calendar to create the event in.
     */
    calendarId: string;
    /**
     * Email notifications containing the calendar event is sent to all event participants.
     */
    notifyParticipants?: boolean;
}
/**
 * Interface representing of the query parameters for finding an event.
 */
export interface FindEventQueryParams {
    /**
     * Calendar ID to find the event in. "primary" is a supported value indicating the user's primary calendar.
     */
    calendarId: string;
}
/**
 * Interface representing of the query parameters for updating events.
 */
export type UpdateEventQueryParams = CreateEventQueryParams;
/**
 * Interface representing of the query parameters for destroying events.
 */
export type DestroyEventQueryParams = CreateEventQueryParams;
/**
 * Interface representing of the query parameters for sending RSVP to an event.
 */
export type SendRsvpQueryParams = FindEventQueryParams;
/**
 * Interface representing the query parameters for importing events.
 */
export interface ListImportEventQueryParams extends ListQueryParams {
    /**
     * (Required) Calendar ID to import events from. "primary" is a supported value indicating the user's primary calendar.
     * Note: "primary" is not supported for iCloud.
     */
    calendarId: string;
    /**
     * Filter for events that start at or after the specified time, in Unix timestamp format.
     * Defaults to the time of the request.
     */
    start?: number;
    /**
     * Filter for events that end at or before the specified time, in Unix timestamp format.
     * Defaults to one month from the time of the request.
     */
    end?: number;
}
/**
 * Enum representing the status of an event.
 */
type Status = 'confirmed' | 'tentative' | 'cancelled';
/**
 * Enum representing the status of an RSVP response.
 */
type RsvpStatus = 'yes' | 'no' | 'maybe';
/**
 * Enum representing the visibility of an event.
 */
type Visibility = 'default' | 'public' | 'private';
/**
 * Enum representing the supported conferencing providers.
 */
type ConferencingProvider = 'Google Meet' | 'Zoom Meeting' | 'Microsoft Teams' | 'GoToMeeting' | 'WebEx';
/**
 * Enum representing the status of an event participant.
 */
type ParticipantStatus = 'noreply' | 'yes' | 'no' | 'maybe';
/**
 * Enum representing the different types of reminders.
 */
type ReminderMethod = 'email' | 'popup' | 'sound' | 'display';
/**
 * Type representing the different conferencing objects.
 */
export type Conferencing = Details | Autocreate;
/**
 * Type representing the different objects representing time and duration for events.
 */
type When = Time | Timespan | Date | Datespan;
/**
 * Type representing the different objects representing time and duration when creating events.
 */
type CreateWhen = Omit<Time, 'object'> | Omit<Timespan, 'object'> | Omit<Date, 'object'> | Omit<Datespan, 'object'>;
/**
 * Enum representing the different types of when objects.
 */
export declare enum WhenType {
    Time = "time",
    Timespan = "timespan",
    Date = "date",
    Datespan = "datespan"
}
/**
 * Interface of a conferencing details object
 */
export interface Details {
    /**
     * The conferencing provider
     */
    provider: ConferencingProvider;
    /**
     * The conferencing details
     */
    details: DetailsConfig;
}
/**
 * Interface of a the configuration for a conferencing object
 */
export interface DetailsConfig {
    /**
     * The conferencing meeting code. Used for Zoom.
     */
    meetingCode?: string;
    /**
     * The conferencing meeting password. Used for Zoom.
     */
    password?: string;
    /**
     * The conferencing meeting url.
     */
    url?: string;
    /**
     * The conferencing meeting pin. Used for Google Meet.
     */
    pin?: string;
    /**
     * The conferencing meeting phone numbers. Used for Google Meet.
     */
    phone?: string[];
}
/**
 * Class representation of a conferencing autocreate object
 */
export interface Autocreate {
    /**
     * The conferencing provider
     */
    provider: ConferencingProvider;
    /**
     * Empty dict to indicate an intention to autocreate a video link.
     * Additional provider settings may be included in autocreate.settings, but Nylas does not validate these.
     */
    autocreate: Record<string, unknown>;
}
/**
 * Class representation of a specific point in time.
 * A meeting at 2pm would be represented as a time subobject.
 */
export interface Time {
    /**
     * A UNIX timestamp representing the time of occurrence.
     */
    time: number;
    /**
     * If timezone is present, then the value for time will be read with timezone.
     * Timezone using IANA formatted string. (e.g. "America/New_York")
     * @see <a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones">List of tz database time zones</a>
     */
    timezone: string;
    /**
     * The type of 'when' object.
     */
    object: WhenType.Time;
}
/**
 * Class representation of a time span with start and end times.
 * An hour lunch meeting would be represented as timespan subobjects.
 */
export interface Timespan {
    /**
     * The start time of the event.
     */
    startTime: number;
    /**
     * The end time of the event.
     */
    endTime: number;
    /**
     * The timezone of the start time.
     * Timezone using IANA formatted string. (e.g. "America/New_York")
     * @see <a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones">List of tz database time zones</a>
     */
    startTimezone?: string;
    /**
     * The timezone of the end time.
     * Timezone using IANA formatted string. (e.g. "America/New_York")
     * @see <a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones">List of tz database time zones</a>
     */
    endTimezone?: string;
    /**
     * The type of 'when' object.
     */
    object: WhenType.Timespan;
}
/**
 * Class representation of an entire day spans without specific times.
 * Your birthday and holidays would be represented as date subobjects.
 */
export interface Date {
    /**
     * Date of occurrence in ISO 8601 format.
     * @see <a href="https://en.wikipedia.org/wiki/ISO_8601#Calendar_dates">ISO 8601</a>
     */
    date: string;
    /**
     * The type of 'when' object.
     */
    object: WhenType.Date;
}
/**
 * Class representation of a specific dates without clock-based start or end times.
 * A business quarter or academic semester would be represented as datespan subobjects.
 */
export interface Datespan {
    /**
     * The start date in ISO 8601 format.
     * @see <a href="https://en.wikipedia.org/wiki/ISO_8601#Calendar_dates">ISO 8601</a>
     */
    startDate: string;
    /**
     * The end date in ISO 8601 format.
     * @see <a href="https://en.wikipedia.org/wiki/ISO_8601#Calendar_dates">ISO 8601</a>
     */
    endDate: string;
    /**
     * The type of 'when' object.
     */
    object: WhenType.Datespan;
}
/**
 * Interface representing an Event participant.
 */
export interface Participant {
    /**
     * Participant's email address.
     */
    email: string;
    /**
     * Participant's name.
     */
    name?: string;
    /**
     * Participant's status.
     */
    status: ParticipantStatus;
    /**
     * Comment by the participant.
     */
    comment?: string;
    /**
     * Participant's phone number.
     */
    phoneNumber?: string;
}
/**
 * Interface representing the reminders field of an event.
 */
export interface Reminders {
    /**
     * Whether to use the default reminders for the calendar.
     * When true, uses the default reminder settings for the calendar
     */
    useDefault: boolean;
    /**
     * A list of reminders for the event if useDefault is set to false.
     */
    overrides: ReminderOverride[];
}
/**
 * Interface representing the reminder details for an event.
 */
export interface ReminderOverride {
    /**
     * The number of minutes before the event start time when a user wants a reminder for this event.
     * Reminder minutes are in the following format: "[20]".
     */
    reminderMinutes: number;
    /**
     * Method to remind the user about the event. (Google only).
     */
    reminderMethod: ReminderMethod;
}
/**
 * Interface representing an email address and optional name.
 */
export interface EmailName {
    /**
     * Email address.
     */
    email: string;
    /**
     * Full name.
     */
    name?: string;
}
/**
 * Type representing the event type to filter by.
 */
export type EventType = 'default' | 'outOfOffice' | 'focusTime' | 'workingLocation';
export {};
