import type { MediationNetwork, AFPurchaseType } from './Appsflyer_constants';

export interface AFInit {
  devKey: string;
  appID: string;
  isDebug?: boolean;
  waitForATTUserAuthorization?: number;
  registerConversionListener?: boolean;
  registerOnAppOpenAttribution?: boolean;
  registerOnDeepLink?: boolean;
  useUninstallSandbox?: boolean;
  useReceiptValidationSandbox?: boolean;
  minTimeBetweenSessions?: number;
  deepLinkTimeout?: number;
  manualStart?: boolean;
}

export interface AFEvent {
  eventName?: string;
  eventValue?: any;
}

export interface OnConversionDataResult {
  callbackName: string;
  errorMessage?: string;
  data?: any;
}

export interface OnAppOpenAttribution {
  callbackName: string;
  errorMessage?: string;
  data?: any;
}
export interface OnDeepLink {
  status: string;
  error?: string;
  deepLink?: any;
}
export interface StringMap {
  [key: string]: string;
}

export interface AFLinkGenerator {
  brandDomain?: string;
  campaign?: string;
  channel?: string;
  referrerName?: string;
  referrerImageURL?: string;
  referrerCustomerId?: string;
  baseDeeplink?: string; //af_dp
  addParameters?: StringMap;
}

export interface AFInAppPurchase {
  currency: string;
  additionalParameters?: StringMap;
}

export interface AFAndroidInAppPurchase extends AFInAppPurchase {
  publicKey: string;
  signature: string;
  purchaseData: string;
  price: string;
}

export interface AFIosInAppPurchase extends AFInAppPurchase {
  inAppPurchase: string;
  price: string;
  transactionId: string;
}

export interface AFPromotion {
  appID: string;
  campaign: string;
  parameters: StringMap;
}

export interface AFLatLng {
  latitude: number;
  longitude: number;
}
export interface AFPartnerData {
  data: any;
  partnerId: string;
}
export interface AFLogInvite {
  eventParameters: StringMap;
  channel: string;
}
export interface AFLink {
  link: string;
}
export interface AFRes {
  res: string;
}
export interface AFUninstall {
  token: string;
}
export interface AFUid {
  uid: string;
}
export interface AFCurrency {
  currencyCode: string;
}
export interface AFCuid {
  cuid: string;
}
export interface AFAnonymizeUser {
  anonymizeUser: boolean;
}
export interface AFOnelinkID {
  onelinkID: string;
}
export interface AFOnelinkDomain {
  domains: string[];
}
export interface AFUrls {
  urls: string[];
}
export interface AFPath {
  path: string[];
}
export interface AFEmails {
  emails: string[];
  encode?: boolean;
}
export interface AFStop {
  stop: boolean;
}
export interface AFIsStopped {
  isStopped: boolean;
}
export interface AFFilters {
  filters: string[];
}
export interface AFData {
  additionalData: any;
}
export interface AFDisable {
  shouldDisable: boolean;
}
export interface AFFbDAL {
  enableFacebookDAL: boolean;
}
export interface AFPushPayload {
  pushPayload: StringMap;
}
export interface AFLanguage {
  language: string;
}
export interface AFPhone {
  phone: string;
}
export interface AFHost {
  hostPrefixName: string;
  hostName: string;
}
export interface AFAppendToDeepLink {
  contains: string;
  parameters: StringMap;
}

export interface AFEnableTCFDataCollection {
  shouldEnableTCFDataCollection: boolean;
}

export interface IAppsFlyerConsent {
  isUserSubjectToGDPR: boolean;
  hasConsentForDataUsage?: boolean;
  hasConsentForAdsPersonalization?: boolean;
}

class AppsFlyerConsentClass implements IAppsFlyerConsent {
  public isUserSubjectToGDPR: boolean;
  public hasConsentForDataUsage?: boolean;
  public hasConsentForAdsPersonalization?: boolean;

  private constructor(
    isUserSubjectToGDPR: boolean,
    hasConsentForDataUsage?: boolean,
    hasConsentForAdsPersonalization?: boolean,
  ) {
    this.isUserSubjectToGDPR = isUserSubjectToGDPR;
    this.hasConsentForDataUsage = hasConsentForDataUsage;
    this.hasConsentForAdsPersonalization = hasConsentForAdsPersonalization;
  }

  static forGDPRUser(hasConsentForDataUsage: boolean, hasConsentForAdsPersonalization: boolean): IAppsFlyerConsent {
    return new AppsFlyerConsentClass(true, hasConsentForDataUsage, hasConsentForAdsPersonalization);
  }

  static forNonGDPRUser(): IAppsFlyerConsent {
    return new AppsFlyerConsentClass(false);
  }
}

export const AppsFlyerConsent = {
  forGDPRUser: AppsFlyerConsentClass.forGDPRUser,
  forNonGDPRUser: AppsFlyerConsentClass.forNonGDPRUser,
};

export interface AFConsentData {
  data: IAppsFlyerConsent;
}

export interface AFAdRevenueData {
  monetizationNetwork: string;
  mediationNetwork: MediationNetwork;
  currencyIso4217Code: string;
  revenue: number;
  additionalParameters?: StringMap;
}

export interface AFConsentOptions {
  isUserSubjectToGDPR?: boolean | null;
  hasConsentForDataUsage?: boolean | null;
  hasConsentForAdsPersonalization?: boolean | null;
  hasConsentForAdStorage?: boolean | null;
}

export interface AFIsStarted {
  isStarted: boolean;
}

export interface AFPurchaseDetails {
  purchaseType: AFPurchaseType;
  purchaseToken: string;
  productId: string;
}

export interface AFPurchaseDetailsV2 {
  purchaseDetails: AFPurchaseDetails;
  additionalParameters?: StringMap;
}
