import { TurboModuleRegistry, type TurboModule } from 'react-native';

export interface Spec extends TurboModule {
  // Airship
  takeOff(config: Object): Promise<boolean>;
  isFlying(): Promise<boolean>;
  airshipListenerAdded(eventName: string): void;
  takePendingEvents(
    eventName: string,
    isHeadlessJS: boolean
  ): Promise<Object[]>;
  addListener: (eventType: string) => void;
  removeListeners: (count: number) => void;

  // Channel
  channelEnableChannelCreation(): Promise<void>;
  channelAddTag(tag: string): Promise<void>;
  channelRemoveTag(tag: string): Promise<void>;
  channelEditTags(operations: Object[]): Promise<void>;
  channelGetTags(): Promise<string[]>;
  channelGetChannelId(): Promise<string | null | undefined>;
  channelWaitForChannelId(): Promise<string>;
  channelGetSubscriptionLists(): Promise<string[]>;
  channelEditTagGroups(operations: Object[]): Promise<void>;
  channelEditAttributes(operations: Object[]): Promise<void>;
  channelEditSubscriptionLists(operations: Object[]): Promise<void>;

  // Push
  pushSetUserNotificationsEnabled(enabled: boolean): Promise<void>;
  pushIsUserNotificationsEnabled(): Promise<boolean>;
  pushEnableUserNotifications(options?: Object): Promise<boolean>;
  pushGetNotificationStatus(): Promise<Object>;
  pushGetRegistrationToken(): Promise<string | null | undefined>;
  pushGetActiveNotifications(): Promise<Object[]>;
  pushClearNotifications(): void;
  pushClearNotification(identifier: string): void;

  // // Push.ios
  pushIosSetForegroundPresentationOptions(options: string[]): Promise<void>;
  pushIosSetNotificationOptions(options: string[]): Promise<void>;
  pushIosSetAutobadgeEnabled(enabled: boolean): Promise<void>;
  pushIosIsAutobadgeEnabled(): Promise<boolean>;
  pushIosSetBadgeNumber(badgeNumber: number): Promise<void>;
  pushIosGetBadgeNumber(): Promise<number>;
  pushIosIsOverridePresentationOptionsEnabled(enabled: boolean): void;
  pushIosOverridePresentationOptions(requestId: string, options?: string[]): void;
  pushIosGetAuthorizedNotificationSettings(): Promise<string[]>;
  pushIosGetAuthorizedNotificationStatus(): Promise<string>;

  // Push.android
  pushAndroidIsNotificationChannelEnabled(channel: string): Promise<boolean>;
  pushAndroidSetNotificationConfig(config: Object): void;
  pushAndroidIsOverrideForegroundDisplayEnabled(enabled: boolean): void;
  pushAndroidOverrideForegroundDisplay(requestId: string, shouldDisplay: boolean): void;

  // Contact
  contactIdentify(namedUser: string): Promise<void>;
  contactReset(): Promise<void>;
  contactNotifyRemoteLogin(): Promise<void>;
  contactGetNamedUserId(): Promise<string | null | undefined>;
  contactGetSubscriptionLists(): Promise<Object>;
  contactEditTagGroups(operations: Object[]): Promise<void>;
  contactEditAttributes(operations: Object[]): Promise<void>;
  contactEditSubscriptionLists(operations: Object[]): Promise<void>;

  // Analytics
  analyticsTrackScreen(screen?: string): Promise<void>;
  analyticsAssociateIdentifier(key: string, identifier?: string): Promise<void>;
  addCustomEvent(event: Object): Promise<void>;
  analyticsGetSessionId(): Promise<string>;


  // Action
  actionRun(action: Object): Promise<Object | Error>;

  // Privacy Manager
  privacyManagerSetEnabledFeatures(features: string[]): Promise<void>;
  privacyManagerGetEnabledFeatures(): Promise<string[]>;
  privacyManagerEnableFeature(features: string[]): Promise<void>;
  privacyManagerDisableFeature(features: string[]): Promise<void>;
  privacyManagerIsFeatureEnabled(features: string[]): Promise<void>;

  // InApp
  inAppSetDisplayInterval(milliseconds: number): Promise<void>;
  inAppGetDisplayInterval(): Promise<number>;
  inAppSetPaused(paused: boolean): Promise<void>;
  inAppIsPaused(): Promise<boolean>;
  inAppResendPendingEmbeddedEvent(): void;

  // Message Center
  messageCenterGetUnreadCount(): Promise<number>;
  messageCenterDismiss(): Promise<void>;
  messageCenterDisplay(messageId?: string): Promise<void>;
  messageCenterGetMessages(): Promise<Object[]>;
  messageCenterDeleteMessage(messageId: string): Promise<void>;
  messageCenterMarkMessageRead(messageId: string): Promise<void>;
  messageCenterRefresh(): Promise<void>;
  messageCenterSetAutoLaunchDefaultMessageCenter(enabled: boolean): void;
  messageCenterShowMessageCenter(messageId?: string): Promise<void>;
  messageCenterShowMessageView(messageId: string): Promise<void>;

  // Preference Center
  preferenceCenterDisplay(preferenceCenterId: string): Promise<void>;
  preferenceCenterGetConfig(preferenceCenterId: string): Promise<Object>;
  preferenceCenterAutoLaunchDefaultPreferenceCenter(
    preferenceCenterId: string,
    autoLaunch: boolean
  ): void;

  // Locale
  localeSetLocaleOverride(localeIdentifier: string): Promise<void>;
  localeGetLocale(): Promise<string>;
  localeClearLocaleOverride(): Promise<void>;

  // Feature Flag Manager
  featureFlagManagerFlag(flagName: string, useResultCache: boolean):Promise<Object>;
  featureFlagManagerTrackInteraction(flag: Object): Promise<void>;
  featureFlagManagerResultCacheGetFlag(flagName: string): Promise<Object>;
  featureFlagManagerResultCacheSetFlag(flag: Object, ttl: number): Promise<void>;
  featureFlagManagerResultCacheRemoveFlag(flagName: string): Promise<void>;

  // Live Activity
  liveActivityListAll(): Promise<Object>;
  liveActivityList(request: Object): Promise<Object>;
  liveActivityStart(request: Object): Promise<Object>;
  liveActivityUpdate(request: Object): Promise<void>;
  liveActivityEnd(request: Object): Promise<void>;

  // Live Update
  liveUpdateListAll(): Promise<Object>;
  liveUpdateList(request: Object): Promise<Object>;
  liveUpdateStart(request: Object): Promise<void>;
  liveUpdateUpdate(request: Object): Promise<void>;
  liveUpdateEnd(request: Object): Promise<void>;
  liveUpdateClearAll(): Promise<void>;
}

export default TurboModuleRegistry.getEnforcing<Spec>('RNAirship');
