declare namespace NFC {
  type NfcType =
    | 'ISO-DEP'
    | 'MIFARE Classic'
    | 'MIFARE Ultralight'
    | 'NFC-A'
    | 'NFC-B'
    | 'NFC-F'
    | 'NFC-V'
    | 'Ndef'
    | 'Ndef Formatable'
    | '';
  type Data = {
    id: ArrayBuffer;
    /**
     * (
      | 'ISO-DEP'
      | 'MIFARE Classic'
      | 'MIFARE Ultralight'
      | 'NFC-A'
      | 'NFC-B'
      | 'NFC-F'
      | 'NFC-V'
    )
     */
    techs: NfcType[];

    /**
     * ndef 数据
     */
    ndefMessage?: string;
    /** SAK */
    sak?: number;
    /** SAK 类型 */
    sakType?: string;
    sakHex?: string;

    /** 最大数据传输长度 */
    maxTransceiveLength?: number;
    /** 卡类型 */
    nfcType?: NfcType;
    /** 读写标准 */
    readWriteStandard?: string[];
    /** 其他数据 */
    [key: string]: any;
  };

  type TransformId = {
    /** 卡片id 10进制字符串 */
    byteArray: number[];
    /** 卡片id 16进制字符串 */
    hexArray: string[];
    /** 卡片id 16进制字符串 */
    hexString: string;
  };

  type Result = Data & TransformId;

  type Atqa = {
    atqa: ArrayBuffer;
    errMsg: string;
  };

  type Sak = {
    /**
     * SAK 是 NFC 终端设备（如手机）与 NFC 标签通信时返回的一个字节数据
     *
     * 0x00	未指定类型
     * 0x08	Mifare Classic 1K
     * 0x09	Mifare Classic Mini
     * 0x10	Mifare Plus
     * 0x11	Mifare Classic 4K
     * 0x18	Mifare Ultralight / Ultralight C
     * 0x20	DESFire
     */
    sak: number;
    errno: number;
    errMsg: string;
  };

  type MaxTransceiveLength = {
    /** 最大传输长度 */
    length: number;
    errno: number;
    errMsg: string;
  };

  type Connected = {
    /** 标签是否连接 */
    connected: boolean;
    errno: number;
    errMsg: string;
  };

  type FnOption<R = any, E = any> = {
    success?: (result: R) => void;
    fail?: (error: E) => void;
    complete?: (res: R | E) => void;
  };

  type NdefData = {
    /** uri 数组 */
    uris?: any[];
    /** text 数组 */
    texts?: any[];
    /** 二进制对象数组, 需要指明 id, type 以及 payload (均为 ArrayBuffer 类型) */
    records?: any[];
  };

  type Instance = {
    /** 连接 NFC 标签 */
    connect: (options?: FnOption) => void;
    /** 断开连接 */
    close: (options?: FnOption) => void;
    /** 设置超时时间 */
    setTimeout: (options: ?(FnOption & { timeout: number })) => void;
    /** 获取最大传输长度 */
    getMaxTransceiveLength: (options?: FnOption<MaxTransceiveLength>) => void;
    /**
     * 写入数据
     * 支持以以下类型
     * ISO-DEP
     * MIFARE Classic
     * MIFARE Ultralight
     * NFC-A
     * NFC-B
     * NFC-F
     * NFC-V
     */
    transceive?: (options: ?(FnOption & { data: ArrayBuffer })) => void;
    /**
     * 写入数据
     * 支持以以下类型
     * Ndef
     *
     */
    writeNdefMessage?: (options: ?(FnOption & NdefData)) => void;
    /** 获取ATQA信息 */
    getAtqa?: (options?: FnOption<Atqa>) => void;
    /** 获取SAK信息 */
    getSak?: (options?: FnOption<Sak>) => void;
    /** 检测标签是否连接 */
    isConnected?: (options?: FnOption<Connected>) => void;
  };

  type Adapter = {
    /** 获取IsoDep实例，实例支持ISO-DEP (ISO 14443-4)标准的读写 */
    getIsoDep: () => any;
    /** 获取MifareClassic实例，实例支持MIFARE Classic标签的读写 */
    getMifareClassic: () => any;
    /** 获取MifareUltralight实例，实例支持MIFARE Ultralight标签的读写 */
    getMifareUltralight: () => any;
    /** 获取Ndef实例，实例支持对NDEF格式的NFC标签上的NDEF数据的读写 */
    getNdef: (options?: FnOption) => NfcA;
    /** 获取NfcA实例，实例支持NFC-A (ISO 14443-3A)标准的读写 */
    getNfcA: (options?: FnOption) => any;
    /** 获取NfcB实例，实例支持NFC-B (ISO 14443-3B)标准的读写 */
    getNfcB: (options?: FnOption) => any;
    /** 获取NfcF实例，实例支持NFC-F (JIS 6319-4)标准的读写 */
    getNfcF: (options?: FnOption) => any;
    /** 获取NfcV实例，实例支持NFC-V (ISO 15693)标准的读写 */
    getNfcV: (options?: FnOption) => any;
    /** 启用 nfc 模块  */
    startDiscovery: (options?: FnOption) => void;
    /** 停用 nfc 模块 */
    stopDiscovery: () => void;
    /** nfc 读取监听 */
    onDiscovered: (callback: (res: NFC.Data) => void) => void;
    /** nfc 移除监听 */
    offDiscovered: (callback: (res: NFC.Data) => void) => void;

    /** 安卓环境 判断适配器是否可用 */
    isEnabled: () => boolean;

    /** 安卓环境 停用前台调度 */
    disableForegroundDispatch: (main: any) => void;

    /** 安卓环境 启用前台调度 */
    enableForegroundDispatch: (
      main: any,
      pendingIntent: any,
      intentFiltersArray: any[],
      techListsArray: any[] | null,
    ) => void;
  };
}
