import { AxiosRequestConfig } from 'axios'
import { proto } from '../../WAProto'
import { BaileysEventEmitter, ChatModification, ChatMutation, Contact, InitialAppStateSyncOptions, LTHashState, WAPatchCreate, WAPatchName } from '../Types'
import { BinaryNode } from '../WABinary'
import { ILogger } from './logger'

type FetchAppStateSyncKey = (keyId: string) => Promise<proto.Message.IAppStateSyncKeyData | null | undefined>

export type ChatMutationMap = {
    [index: string]: ChatMutation
}

export declare const newLTHashState: () => LTHashState

export declare const encodeSyncdPatch: ({ type, index, syncAction, apiVersion, operation }: WAPatchCreate, myAppStateKeyId: string, state: LTHashState, getAppStateSyncKey: FetchAppStateSyncKey) => Promise<{
    patch: proto.ISyncdPatch
    state: LTHashState
}>

export declare const decodeSyncdMutations: (msgMutations: (proto.ISyncdMutation | proto.ISyncdRecord)[], initialState: LTHashState, getAppStateSyncKey: FetchAppStateSyncKey, onMutation: (mutation: ChatMutation) => void, validateMacs: boolean) => Promise<{
    hash: Buffer
    indexValueMap: {
        [indexMacBase64: string]: {
            valueMac: Uint8Array | Buffer
        }
    }
}>

export declare const decodeSyncdPatch: (msg: proto.ISyncdPatch, name: WAPatchName, initialState: LTHashState, getAppStateSyncKey: FetchAppStateSyncKey, onMutation: (mutation: ChatMutation) => void, validateMacs: boolean) => Promise<{
    hash: Buffer
    indexValueMap: {
        [indexMacBase64: string]: {
            valueMac: Uint8Array | Buffer
        }
    }
}>

export declare const extractSyncdPatches: (result: BinaryNode, options: AxiosRequestConfig<{}>) => Promise<{
    critical_block: {
        patches: proto.ISyncdPatch[]
        hasMorePatches: boolean
        snapshot?: proto.ISyncdSnapshot | undefined
    }
    critical_unblock_low: {
        patches: proto.ISyncdPatch[]
        hasMorePatches: boolean
        snapshot?: proto.ISyncdSnapshot | undefined
    }
    regular_high: {
        patches: proto.ISyncdPatch[]
        hasMorePatches: boolean
        snapshot?: proto.ISyncdSnapshot | undefined
    }
    regular_low: {
        patches: proto.ISyncdPatch[]
        hasMorePatches: boolean
        snapshot?: proto.ISyncdSnapshot | undefined
    }
    regular: {
        patches: proto.ISyncdPatch[]
        hasMorePatches: boolean
        snapshot?: proto.ISyncdSnapshot | undefined
    }
}>

export declare const downloadExternalBlob: (blob: proto.IExternalBlobReference, options: AxiosRequestConfig<{}>) => Promise<Buffer>
export declare const downloadExternalPatch: (blob: proto.IExternalBlobReference, options: AxiosRequestConfig<{}>) => Promise<proto.SyncdMutations>
export declare const decodeSyncdSnapshot: (name: WAPatchName, snapshot: proto.ISyncdSnapshot, getAppStateSyncKey: FetchAppStateSyncKey, minimumVersionNumber: number | undefined, validateMacs?: boolean) => Promise<{
    state: LTHashState
    mutationMap: ChatMutationMap
}>

export declare const decodePatches: (name: WAPatchName, syncds: proto.ISyncdPatch[], initial: LTHashState, getAppStateSyncKey: FetchAppStateSyncKey, options: AxiosRequestConfig<{}>, minimumVersionNumber?: number, logger?: ILogger, validateMacs?: boolean) => Promise<{
    state: LTHashState
    mutationMap: ChatMutationMap
}>

export declare const chatModificationToAppPatch: (mod: ChatModification, jid: string) => WAPatchCreate

export declare const processSyncAction: (syncAction: ChatMutation, ev: BaileysEventEmitter, me: Contact, initialSyncOpts?: InitialAppStateSyncOptions, logger?: ILogger) => void

export {}