"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.OrderPositionInfo = void 0;
const bufio_1 = require("@node-dlc/bufio");
const MessageType_1 = require("../MessageType");
/**
 * OrderPositionInfo message
 */
class OrderPositionInfo {
    constructor() {
        /**
         * The type for OrderPositionInfo message
         */
        this.type = OrderPositionInfo.type;
        this.shiftForFees = 'neither';
        this.fees = BigInt(0);
        this.instrumentName = undefined;
        this.contractSize = BigInt(0);
        this.direction = 'neither';
        this.price = BigInt(0); // Can be BTC or USD depending on the instrument
        this.extraPrecision = 0;
    }
    /**
     * Deserializes an OrderPositionInfo message
     * @param buf
     */
    static deserialize(buf) {
        const instance = new OrderPositionInfo();
        const reader = new bufio_1.BufferReader(buf);
        reader.readBigSize(); // read type
        instance.length = reader.readBigSize();
        const encodedShiftForFees = reader.readUInt8();
        if (encodedShiftForFees === 0) {
            instance.shiftForFees = 'neither';
        }
        else if (encodedShiftForFees === 1) {
            instance.shiftForFees = 'offeror';
        }
        else if (encodedShiftForFees === 2) {
            instance.shiftForFees = 'acceptor';
        }
        else {
            throw new Error(`Invalid shift for fees value: ${encodedShiftForFees}`);
        }
        instance.fees = reader.readUInt64BE();
        if (!reader.eof) {
            const instrumentNameLength = reader.readBigSize();
            const instrumentName = reader.readBytes(Number(instrumentNameLength));
            instance.instrumentName = instrumentName.toString();
            instance.contractSize = reader.readUInt64BE();
            const direction = reader.readUInt8();
            if (direction === 0) {
                instance.direction = 'neither';
            }
            else if (direction === 1) {
                instance.direction = 'buy';
            }
            else if (direction === 2) {
                instance.direction = 'sell';
            }
            else {
                throw new Error(`Invalid direction value: ${direction}`);
            }
            instance.price = reader.readUInt64BE();
            instance.extraPrecision = reader.readUInt16BE();
        }
        return instance;
    }
    /**
     * Converts OrderPositionInfo to JSON
     */
    toJSON() {
        return {
            type: this.type,
            shiftForFees: this.shiftForFees,
            fees: Number(this.fees),
            instrumentName: this.instrumentName,
            direction: this.direction,
            price: Number(this.price),
            extraPrecision: this.extraPrecision,
        };
    }
    /**
     * Serializes the OrderPositionInfo message into a Buffer
     */
    serialize() {
        const writer = new bufio_1.BufferWriter();
        writer.writeBigSize(this.type);
        const dataWriter = new bufio_1.BufferWriter();
        dataWriter.writeUInt8(this.shiftForFees === 'neither'
            ? 0
            : this.shiftForFees === 'offeror'
                ? 1
                : 2);
        dataWriter.writeUInt64BE(this.fees);
        if (this.instrumentName) {
            dataWriter.writeBigSize(this.instrumentName.length);
            dataWriter.writeBytes(Buffer.from(this.instrumentName));
            dataWriter.writeUInt64BE(this.contractSize);
            dataWriter.writeUInt8(this.direction === 'neither' ? 0 : this.direction === 'buy' ? 1 : 2);
            dataWriter.writeUInt64BE(this.price);
            dataWriter.writeUInt16BE(this.extraPrecision);
        }
        writer.writeBigSize(dataWriter.size);
        writer.writeBytes(dataWriter.toBuffer());
        return writer.toBuffer();
    }
}
exports.OrderPositionInfo = OrderPositionInfo;
OrderPositionInfo.type = MessageType_1.MessageType.OrderPositionInfo;
//# sourceMappingURL=OrderPositionInfo.js.map