import { PluginListenerHandle } from '@capacitor/core';

export interface BranchReferringParams {
  '+clicked_branch_link': boolean;
  '+is_first_session': boolean;
  [key: string]: any;
}

export interface BranchReferringParamsResponse {
  referringParams: BranchReferringParams;
}

export interface BranchUrlParams {
  branch: string;
}

export interface BranchShortUrlAnalytics {
  alias?: string;
  campaign?: string;
  channel?: string;
  duration?: number;
  feature?: string;
  stage?: string;
  tags?: Array<string>;
}

export interface BranchShortUrlProperties {
  $desktop_url?: string;
  $android_url?: string;
  $ios_url?: string;
  $ipad_url?: string;
  $match_duration?: number;
  custom_string?: string;
  custom_integer?: number;
  custom_boolean?: boolean;
}

export interface BranchShortUrlParams {
  analytics?: BranchShortUrlAnalytics;
  properties?: BranchShortUrlProperties;
}

export interface BranchShowShareSheetParams extends BranchShortUrlParams {
  shareText?: string;
}

export interface BranchShortUrlResponse {
  url: string;
}

export interface BranchTrackingResponse {
  is_enabled: boolean;
}

export interface BranchLoggedOutResponse {
  logged_out: boolean;
}

export interface BranchQRCodeParams {
  analytics?: BranchShortUrlAnalytics;
  properties?: BranchShortUrlProperties;
  settings?: BranchQRCodeSettings;
}

export interface BranchQRCodeSettings {
  codeColor?: string;
  backgroundColor?: string;
  centerLogo?: string;
  width?: number;
  margin?: number;
  imageFormat?: string;
}

export interface BranchQRCodeResponse {
  qrCode: String;
}

export interface BranchDMAParams {
  eeaRegion: boolean;
  adPersonalizationConsent: boolean;
  adUserDataUsageConsent: boolean;
}

export interface BranchInitEvent extends BranchReferringParamsResponse {}

export type BranchATTAuthorizationStatus = 0 | 1 | 2 | 3;

export type BranchConsumerProtectionAttributionLevel = 'FULL' | 'REDUCED' | 'MINIMAL' | 'NONE';

export interface BranchDeepLinksPlugin {
  addListener(
    eventName: 'init',
    listenerFunc: (event: BranchInitEvent) => void,
  ): Promise<PluginListenerHandle>;
  addListener(
    eventName: 'initError',
    listenerFunc: (error: any) => void,
  ): Promise<PluginListenerHandle>;
  handleUrl(options: BranchUrlParams): Promise<void>;
  generateShortUrl(
    options: BranchShortUrlParams,
  ): Promise<BranchShortUrlResponse>;
  showShareSheet(options: BranchShowShareSheetParams): Promise<void>;
  getStandardEvents(): Promise<{ [index: number]: string }>;
  sendBranchEvent(options: {
    eventName: string;
    metaData: { [key: string]: any };
  }): Promise<void>;
  handleATTAuthorizationStatus(options: {
    status: BranchATTAuthorizationStatus;
  }): Promise<void>;
  disableTracking(options: {
    isEnabled: false;
  }): Promise<BranchTrackingResponse>;
  setIdentity(options: {
    newIdentity: string;
  }): Promise<BranchReferringParamsResponse>;
  logout(): Promise<BranchLoggedOutResponse>;
  getBranchQRCode(options: BranchQRCodeParams): Promise<BranchQRCodeResponse>;
  getLatestReferringParams(): Promise<BranchReferringParamsResponse>;
  getFirstReferringParams(): Promise<BranchReferringParamsResponse>;
  setDMAParamsForEEA: (options: BranchDMAParams) => void;
  setConsumerProtectionAttributionLevel(options: { level: BranchConsumerProtectionAttributionLevel }): Promise<void>;
}
