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

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

    /**
     * Models daemon synchronization information.
     */
    class MoneroDaemonSyncInfo {

      constructor(state) {

        // copy state
        state = Object.assign({}, state);

        // deserialize if necessary
        if (state.peers) {
          for (let i = 0; i < state.peers.length; i++) {
            if (!(state.peers[i] instanceof MoneroPeer)) {
              state.peers[i] = new MoneroPeer(state.peers[i]);
            }
          }
        }
        if (state.spans) {
          for (let i = 0; i < state.spans.length; i++) {
            if (!(state.spans[i] instanceof MoneroConnectionSpan)) {
              state.spans[i] = new MoneroConnectionSpan(state.spans[i]);
            }
          }
        }
        if (state.credits !== undefined && !(state.credits instanceof BigInteger)) state.credits = BigInteger.parse(state.credits);

        // assign internal state
        this.state = state;
      }

      toJson() {
        let json = Object.assign({}, this.state);
        if (json.peers) {
          for (let i = 0; i < json.peers.length; i++) {
            json.peers[i] = json.peers[i].toJson();
          }
        }
        if (json.spans) {
          for (let i = 0; i < json.spans.length; i++) {
            json.spans[i] = json.spans[i].toJson();
          }
        }
        if (json.credits) json.credits = json.credits.toString();
        return json;
      }

      getHeight() {
        return this.state.height;
      }

      setHeight(height) {
        this.state.height = height;
        return this;
      }

      getPeers() {
        return this.state.peers;
      }

      setPeers(peers) {
        this.state.peers = peers;
        return this;
      }

      getSpans() {
        return this.state.spans;
      }

      setSpans(spans) {
        this.state.spans = spans;
        return this;
      }

      getTargetHeight() {
        return this.state.targetHeight;
      }

      setTargetHeight(targetHeight) {
        this.state.targetHeight = targetHeight;
        return this;
      }

      getNextNeededPruningSeed() {
        return this.state.nextNeededPruningSeed;
      }

      setNextNeededPruningSeed(nextNeededPruningSeed) {
        this.state.nextNeededPruningSeed = nextNeededPruningSeed;
        return this;
      }

      getOverview() {
        return this.state.overview;
      }

      setOverview(overview) {
        this.state.overview = overview;
        return this;
      }

      getCredits() {
        return this.state.credits;
      }

      setCredits(credits) {
        this.state.credits = credits;
        return this;
      }

      getTopBlockHash() {
        return this.state.topBlockHash;
      }

      setTopBlockHash(topBlockHash) {
        this.state.topBlockHash = topBlockHash;
        return this;
      }
    }

    module.exports = MoneroDaemonSyncInfo;