var BufferReader = require('./bufferreader');
var BufferWriter = require('./bufferwriter');

var Blockheader = function Blockheader(version, prevblockidbuf, merklerootbuf, time, bits, nonce) {
  if (!(this instanceof Blockheader))
    return new Blockheader(version, prevblockidbuf, merklerootbuf, time, bits, nonce);
  if (typeof version === 'number') {
    this.set({
      version: version,
      prevblockidbuf: prevblockidbuf,
      merklerootbuf: merklerootbuf,
      time: time,
      bits: bits,
      nonce: nonce
    });
  } else if (version) {
    var obj = version;
    this.set(obj);
  }
}

Blockheader.prototype.set = function(obj) {
  this.version = typeof obj.version !== 'undefined' ? obj.version : this.version;
  this.prevblockidbuf = obj.prevblockidbuf || this.prevblockidbuf;
  this.merklerootbuf = obj.merklerootbuf || this.merklerootbuf;
  this.time = typeof obj.time !== 'undefined' ? obj.time : this.time;
  this.bits = typeof obj.bits !== 'undefined' ? obj.bits : this.bits;
  this.nonce = typeof obj.nonce !== 'undefined' ? obj.nonce : this.nonce;
  return this;
};

Blockheader.prototype.fromBuffer = function(buf) {
  return this.fromBufferReader(BufferReader(buf));
};

Blockheader.prototype.fromBufferReader = function(br) {
  this.version = br.readUInt32LE();
  this.prevblockidbuf = br.read(32);
  this.merklerootbuf = br.read(32);
  this.time = br.readUInt32LE();
  this.bits = br.readUInt32LE();
  this.nonce = br.readUInt32LE();
  return this;
};

Blockheader.prototype.toBuffer = function() {
  return this.toBufferWriter().concat();
};

Blockheader.prototype.toBufferWriter = function(bw) {
  if (!bw)
    bw = new BufferWriter();
  bw.writeUInt32LE(this.version);
  bw.write(this.prevblockidbuf);
  bw.write(this.merklerootbuf);
  bw.writeUInt32LE(this.time);
  bw.writeUInt32LE(this.bits);
  bw.writeUInt32LE(this.nonce);
  return bw;
};

module.exports = Blockheader;