var VersionedData = require('../util/VersionedData');
var EncodedData = require('../util/EncodedData');
var networks = require('../networks');
var util = require('util');

//compressed is true if public key is compressed; false otherwise
function PrivateKey(version, buf, compressed) {
  PrivateKey.super_.call(this, version, buf);
  if (compressed !== undefined)
    this.compressed(compressed);
};
util.inherits(PrivateKey, VersionedData);
EncodedData.applyEncodingsTo(PrivateKey);

PrivateKey.prototype.validate = function() {
  this.doAsBinary(function() {
    PrivateKey.super_.prototype.validate.call(this);
    if (this.data.length < 32 || (this.data.length > 1 + 32 && !this.compressed()) || (this.data.length == 1 + 32 + 1 && this.data[1 + 32 + 1 - 1] != 1) || this.data.length > 1 + 32 + 1)
      throw new Error('invalid data length');
  });
  if (typeof this.network() === 'undefined') throw new Error('invalid network');
};

// get or set the payload data (as a Buffer object)
// overloaded from VersionedData
PrivateKey.prototype.payload = function(data) {
  if (data) {
    this.doAsBinary(function() {
      data.copy(this.data, 1);
    });
    return data;
  }
  var buf = this.as('binary');
  if (buf.length == 1 + 32 + 1)
    return buf.slice(1, 1 + 32);
  else if (buf.length == 1 + 32)
    return buf.slice(1);
};

// get or set whether the corresponding public key is compressed
PrivateKey.prototype.compressed = function(compressed) {
  if (compressed !== undefined) {
    this.doAsBinary(function() {
      var len = 1 + 32 + 1;
      if (compressed) {
        var data = new Buffer(len);
        this.data.copy(data);
        this.data = data;
        this.data[len - 1] = 1;
      } else {
        this.data = this.data.slice(0, len - 1);
      }
    });
  } else {
    var len = 1 + 32 + 1;
    var data = this.as('binary');
    if (data.length == len && data[len - 1] == 1)
      return true;
    else if (data.length == len - 1)
      return false;
    else
      throw new Error('invalid private key');
  }
};

PrivateKey.prototype.network = function() {
  var version = this.version();

  var livenet = networks.livenet;
  var testnet = networks.testnet;

  var answer;
  if (version === livenet.privKeyVersion)
    answer = livenet;
  else if (version === testnet.privKeyVersion)
    answer = testnet;

  return answer;
};

module.exports = PrivateKey;