# Source: src/main/js/daemon/model/MoneroFeeEstimate.js

    const BigInteger = require("../../common/biginteger").BigInteger;
    const GenUtils = require("../../common/GenUtils");

    /**
     * Models a Monero fee estimate.
     */
    class MoneroFeeEstimate {

      /**
       * Construct the model.
       *
       * @param {MoneroFeeEstimate|object} state - MoneroFeeEstimate or JS object
       */
      constructor(state) {
        if (!state) this.state = {};
        else if (state instanceof MoneroFeeEstimate) this.state = state.toJson();
        else if (typeof state === "object") this.state = Object.assign({}, state);
        else throw new MoneroError("state must be a MoneroFeeEstimate or JavaScript object");

        // deserialize
        if (this.state.fee !== undefined && !(this.state.fee instanceof BigInteger)) this.state.fee = BigInteger.parse(this.state.fee);
        if (this.state.fees !== undefined) {
          for (let i = 0; i < this.state.fees.length; i++) {
            if (!(this.state.fees[i] instanceof BigInteger)) this.state.fees[i] = BigInteger.parse(this.state.fees[i]);
          }
        }
        if (this.state.quantizationMask !== undefined && !(this.state.quantizationMask instanceof BigInteger)) this.state.quantizationMask = BigInteger.parse(this.state.quantizationMask);
      }

      getFee() {
        return this.state.fee;
      }

      setFee(fee) {
        this.state.fee = fee;
        return this;
      }

      getFees() {
        return this.state.fees;
      }

      setFees(fees) {
        this.state.fees = fees;
        return this;
      }

      getQuantizationMask() {
        return this.state.quantizationMask;
      }

      setQuantizationMask(quantizationMask) {
        this.state.quantizationMask = quantizationMask;
        return this;
      }

      copy() {
        return new MoneroFeeEstimate(this);
      }

      toJson() {
        let json = Object.assign({}, this.state);
        if (this.getFee()) json.fee = this.getFee().toString();
        if (this.getFees()) for (let i = 0; i < this.getFees().length; i++) json.fees[i] = this.getFees()[i].toString();
        if (this.getQuantizationMask()) json.quantizationMask = this.getQuantizationMask().toString();
        return json;
      }

      toString(indent = 0) {
        let str = "";
        let json = this.toJson();
        str += GenUtils.kvLine("Fee", json.fee, indent);
        str += GenUtils.kvLine("Fees", json.fees, indent);
        str += GenUtils.kvLine("Quantization mask", json.quantizationMask, indent);
        return str.slice(0, str.length - 1);  // strip last newline
      }
    }

    module.exports = MoneroFeeEstimate;