import { proto } from '../../WAProto'

type DecryptGroupSignalOpts = {
   group: string
   authorJid: string
   msg: Uint8Array
}

type ProcessSenderKeyDistributionMessageOpts = {
   item: proto.Message.ISenderKeyDistributionMessage
   authorJid: string
}

type DecryptSignalProtoOpts = {
   jid: string
   type: 'pkmsg' | 'msg'
   ciphertext: Uint8Array
}

type EncryptMessageOpts = {
   jid: string
   data: Uint8Array
}

type EncryptGroupMessageOpts = {
   group: string
   data: Uint8Array
   meId: string
}

type PreKey = {
   keyId: number
   publicKey: Uint8Array
}

type SignedPreKey = PreKey & {
   signature: Uint8Array
}

type E2ESession = {
   registrationId: number
   identityKey: Uint8Array
   signedPreKey: SignedPreKey
   preKey: PreKey
}

type E2ESessionOpts = {
   jid: string
   session: E2ESession
}

export type SignalRepository = {
   decryptGroupMessage(opts: DecryptGroupSignalOpts): Promise<Uint8Array>
   processSenderKeyDistributionMessage(opts: ProcessSenderKeyDistributionMessageOpts): Promise<void>
   decryptMessage(opts: DecryptSignalProtoOpts): Promise<Uint8Array>
   encryptMessage(opts: EncryptMessageOpts): Promise<{
      type: 'pkmsg' | 'msg'
      ciphertext: Uint8Array
   }>
   encryptGroupMessage(opts: EncryptGroupMessageOpts): Promise<{
      senderKeyDistributionMessage: Uint8Array
      ciphertext: Uint8Array
   }>
   injectE2ESession(opts: E2ESessionOpts): Promise<void>
   jidToSignalProtocolAddress(jid: string): string
}

export {}