"use strict";
import ChatBase from "./ChatBase.js"
import nacl from '../../deps/nacl-fast.js'
import ed2curve from '../../deps/ed2curve.js'
import { Sha256 } from 'asmcrypto.js'


export default class ChatTransaction extends ChatBase {
    constructor() {
        super();
        this.type = 18
        this.fee = 0
    }

    set recipientPublicKey(recipientPublicKey) {
        this._base58RecipientPublicKey = recipientPublicKey instanceof Uint8Array ? this.constructor.Base58.encode(recipientPublicKey) : recipientPublicKey
        this._recipientPublicKey = this.constructor.Base58.decode(this._base58RecipientPublicKey)

    }

    set proofOfWorkNonce(proofOfWorkNonce) {
        this._proofOfWorkNonce = this.constructor.utils.int32ToBytes(proofOfWorkNonce)
    }


    set recipient(recipient) {
        this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient)
        this._hasReceipient = new Uint8Array(1)
        this._hasReceipient[0] = 1
    }

    set message(message) {

        this.messageText = message;

        this._message = this.constructor.utils.stringtoUTF8Array(message)
        this._messageLength = this.constructor.utils.int32ToBytes(this._message.length)
    }

    set isEncrypted(isEncrypted) {
        this._isEncrypted = new Uint8Array(1);
        this._isEncrypted[0] = isEncrypted;

        if (isEncrypted === 1) {
            const convertedPrivateKey = ed2curve.convertSecretKey(this._keyPair.privateKey)
            const convertedPublicKey = ed2curve.convertPublicKey(this._recipientPublicKey)
            const sharedSecret = new Uint8Array(32);
            nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedPublicKey);

            this._chatEncryptionSeed = new Sha256().process(sharedSecret).finish().result
            this._encryptedMessage = nacl.secretbox(this._message, this._lastReference.slice(0, 24), this._chatEncryptionSeed)
        }

        this._myMessage = isEncrypted === 1 ? this._encryptedMessage : this._message
        this._myMessageLenth = isEncrypted === 1 ? this.constructor.utils.int32ToBytes(this._myMessage.length) : this._messageLength
    }

    set isText(isText) {
        this._isText = new Uint8Array(1);
        this._isText[0] = isText;
    }

    get params() {
        const params = super.params;
        params.push(
            this._proofOfWorkNonce,
            this._hasReceipient,
            this._recipient,
            this._myMessageLenth,
            this._myMessage,
            this._isEncrypted,
            this._isText,
            this._feeBytes
        )
        return params;
    }
}