'use strict';

var BN = require('./crypto/bn');
var BufferReader = require('./encoding/bufferreader');
var BufferWriter = require('./encoding/bufferwriter');
var Varint = require('./encoding/varint');
var Script = require('./script');

var Txout = function Txout(valuebn, scriptvi, script) {
  if (!(this instanceof Txout))
    return new Txout(valuebn, scriptvi, script);
  if (valuebn instanceof BN) {
    this.set({
      valuebn: valuebn,
      scriptvi: scriptvi,
      script: script
    });
  } else if (valuebn) {
    var obj = valuebn;
    this.set(obj);
  }
};

Txout.prototype.set = function(obj) {
  this.valuebn = obj.valuebn || this.valuebn;
  this.scriptvi = obj.scriptvi || this.scriptvi;
  this.script = obj.script || this.script;
  return this;
};

Txout.prototype.fromJSON = function(json) {
  this.set({
    valuebn: BN().fromJSON(json.valuebn),
    scriptvi: Varint().fromJSON(json.scriptvi),
    script: Script().fromJSON(json.script)
  });
  return this;
};

Txout.prototype.toJSON = function() {
  return {
    valuebn: this.valuebn.toJSON(),
    scriptvi: this.scriptvi.toJSON(),
    script: this.script.toJSON()
  };
};

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

Txout.prototype.fromBufferReader = function(br) {
  this.valuebn = br.readUInt64LEBN();
  this.scriptvi = Varint(br.readVarintNum());
  this.script = Script().fromBuffer(br.read(this.scriptvi.toNumber()));
  return this;
};

Txout.prototype.toBuffer = function() {
  var bw = new BufferWriter();
  return this.toBufferWriter(bw).concat();
};

Txout.prototype.toBufferWriter = function(bw) {
  if (!bw)
    bw = new BufferWriter();
  bw.writeUInt64LEBN(this.valuebn);
  bw.write(this.scriptvi.buf);
  bw.write(this.script.toBuffer());
  return bw;
};

module.exports = Txout;