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

/**
 * Monero daemon info.
 */
class MoneroDaemonInfo {
  
  constructor(state) {
    state = Object.assign({}, state);
    this.state = state;
    
    // deserialize BigIntegers
    if (state.difficulty !== undefined && !(state.difficulty instanceof BigInteger)) state.difficulty = BigInteger.parse(state.difficulty);
    if (state.cumulativeDifficulty !== undefined && !(state.cumulativeDifficulty instanceof BigInteger)) state.cumulativeDifficulty = BigInteger.parse(state.cumulativeDifficulty);
    if (state.credits !== undefined && !(state.credits instanceof BigInteger)) state.credits = BigInteger.parse(state.credits);
  }
  
  toJson() {
    let json = Object.assign([], this.state);
    if (json.difficulty) json.difficulty = json.difficulty.toString();
    if (json.cumulativeDifficulty) json.cumulativeDifficulty = json.cumulativeDifficulty.toString();
    if (json.credits) json.credits = json.credits.toString();
    return json;
  }
  
  getVersion() {
    return this.state.version;
  }
  
  setVersion(version) {
    this.state.version = version;
    return this;
  }
  
  getNumAltBlocks() {
    return this.state.numAltBlocks;
  }
  
  setNumAltBlocks(numAltBlocks) {
    this.state.numAltBlocks = numAltBlocks;
    return this;
  }
  
  getBlockSizeLimit() {
    return this.state.blockSizeLimit;
  }
  
  setBlockSizeLimit(blockSizeLimit) {
    this.state.blockSizeLimit = blockSizeLimit;
    return this;
  }
  
  getBlockSizeMedian() {
    return this.state.blockSizeMedian;
  }
  
  setBlockSizeMedian(blockSizeMedian) {
    this.state.blockSizeMedian = blockSizeMedian;
    return this;
  }
  
  getBlockWeightLimit() {
    return this.state.blockWeightLimit;
  }
  
  setBlockWeightLimit(blockWeightLimit) {
    this.state.blockWeightLimit = blockWeightLimit;
    return this;
  }
  
  getBlockWeightMedian() {
    return this.state.blockWeightMedian;
  }
  
  setBlockWeightMedian(blockWeightMedian) {
    this.state.blockWeightMedian = blockWeightMedian;
    return this;
  }
  
  getBootstrapDaemonAddress() {
    return this.state.bootstrapDaemonAddress;
  }
  
  setBootstrapDaemonAddress(bootstrapDaemonAddress) {
    this.state.bootstrapDaemonAddress = bootstrapDaemonAddress;
    return this;
  }
  
  getDifficulty() {
    return this.state.difficulty;
  }
  
  setDifficulty(difficulty) {
    this.state.difficulty = difficulty;
    return this;
  }
  
  getCumulativeDifficulty() {
    return this.state.cumulativeDifficulty;
  }
  
  setCumulativeDifficulty(cumulativeDifficulty) {
    this.state.cumulativeDifficulty = cumulativeDifficulty;
    return this;
  }
  
  getFreeSpace() {
    return this.state.freeSpace;
  }
  
  setFreeSpace(freeSpace) {
    this.state.freeSpace = freeSpace;
    return this;
  }
  
  getNumOfflinePeers() {
    return this.state.numOfflinePeers;
  }
  
  setNumOfflinePeers(numOfflinePeers) {
    this.state.numOfflinePeers = numOfflinePeers;
    return this;
  }
  
  getNumOnlinePeers() {
    return this.state.numOnlinePeers;
  }
  
  setNumOnlinePeers(numOnlinePeers) {
    this.state.numOnlinePeers = numOnlinePeers;
    return this;
  }
  
  getHeight() {
    return this.state.height;
  }
  
  setHeight(height) {
    this.state.height = height;
    return this;
  }
  
  getHeightWithoutBootstrap() {
    return this.state.heightWithoutBootstrap;
  }
  
  setHeightWithoutBootstrap(heightWithoutBootstrap) {
    this.state.heightWithoutBootstrap = heightWithoutBootstrap;
    return this;
  }
  
  getNetworkType() {
    return this.state.networkType;
  }

  setNetworkType(networkType) {
    this.state.networkType = networkType;
    return this;
  }

  isOffline() {
    return this.state.isOffline;
  }
  
  setIsOffline(isOffline) {
    this.state.isOffline = isOffline;
    return this;
  }
  
  getNumIncomingConnections() {
    return this.state.numIncomingConnections;
  }
  
  setNumIncomingConnections(numIncomingConnections) {
    this.state.numIncomingConnections = numIncomingConnections;
    return this;
  }
  
  getNumOutgoingConnections() {
    return this.state.numOutgoingConnections;
  }
  
  setNumOutgoingConnections(numOutgoingConnections) {
    this.state.numOutgoingConnections = numOutgoingConnections;
    return this;
  }
  
  getNumRpcConnections() {
    return this.state.numRpcConnections;
  }
  
  setNumRpcConnections(numRpcConnections) {
    this.state.numRpcConnections = numRpcConnections;
    return this;
  }
  
  getStartTimestamp() {
    return this.state.startTimestamp;
  }
  
  setStartTimestamp(startTimestamp) {
    this.state.startTimestamp = startTimestamp;
    return this;
  }
  
  getAdjustedTimestamp() {
    return this.state.adjustedTimestamp;
  }
  
  setAdjustedTimestamp(adjustedTimestamp) {
    this.state.adjustedTimestamp = adjustedTimestamp;
    return this;
  }
  
  getTarget() {
    return this.state.target;
  }
  
  setTarget(target) {
    this.state.target = target;
    return this;
  }
  
  getTargetHeight() {
    return this.state.targetHeight;
  }
  
  setTargetHeight(targetHeight) {
    this.state.targetHeight = targetHeight;
    return this;
  }
  
  getTopBlockHash() {
    return this.state.topBlockHash;
  }
  
  setTopBlockHash(topBlockHash) {
    this.state.topBlockHash = topBlockHash;
    return this;
  }
  
  getNumTxs() {
    return this.state.numTxs;
  }
  
  setNumTxs(numTxs) {
    this.state.numTxs = numTxs;
    return this;
  }
  
  getNumTxsPool() {
    return this.state.numTxsPool;
  }
  
  setNumTxsPool(numTxsPool) {
    this.state.numTxsPool = numTxsPool;
    return this;
  }
  
  getWasBootstrapEverUsed() {
    return this.state.wasBootstrapEverUsed;
  }
  
  setWasBootstrapEverUsed(wasBootstrapEverUsed) {
    this.state.wasBootstrapEverUsed = wasBootstrapEverUsed;
    return this;
  }
  
  getDatabaseSize() {
    return this.state.databaseSize;
  }
  
  setDatabaseSize(databaseSize) {
    this.state.databaseSize = databaseSize;
    return this;
  }
  
  getUpdateAvailable() {
    return this.state.updateAvailable;
  }
  
  setUpdateAvailable(updateAvailable) {
    this.state.updateAvailable = updateAvailable;
    return this;
  }
  
  getCredits() {
    return this.state.credits;
  }
  
  setCredits(credits) {
    this.state.credits = credits;
    return this;
  }
  
  isBusySyncing() {
    return this.state.isBusySyncing;
  }
  
  setIsBusySyncing(isBusySyncing) {
    this.state.isBusySyncing = isBusySyncing;
    return this;
  }
  
  isSynchronized() {
    return this.state.isSynchronized;
  }
  
  setIsSynchronized(isSynchronized) {
    this.state.isSynchronized = isSynchronized;
    return this;
  }
  
  isRestricted() {
    return this.state.isRestricted;
  }
  
  setIsRestricted(isRestricted) {
    this.state.isRestricted = isRestricted;
    return this;
  }
}

module.exports = MoneroDaemonInfo;