'use strict';
var constants4 = require('../v4/constants.js');
var helpers = require('./helpers.js');
var sprintf = require('sprintf-js').sprintf;
/**
 * @returns {String} the address in link form with a default port of 80
 */
exports.href = function (optionalPort) {
  if (optionalPort === undefined) {
    optionalPort = '';
  } else {
    optionalPort = sprintf(':%s', optionalPort);
  }
  return sprintf('http://[%s]%s/', this.correctForm(), optionalPort);
};
/**
 * @returns {String} a link suitable for conveying the address via a URL hash
 */
exports.link = function (options) {
  if (!options) {
    options = {};
  }
  if (options.className === undefined) {
    options.className = '';
  }
  if (options.prefix === undefined) {
    options.prefix = '/#address=';
  }
  if (options.v4 === undefined) {
    options.v4 = false;
  }
  var formFunction = this.correctForm;
  if (options.v4) {
    formFunction = this.to4in6;
  }
  if (options.className) {
    return sprintf('%2$s',
      options.prefix, formFunction.call(this), options.className);
  }
  return sprintf('%2$s', options.prefix,
    formFunction.call(this));
};
/**
 * Groups an address
 * @returns {String}
 */
exports.group = function () {
  var address4 = this.address.match(constants4.RE_ADDRESS);
  var i;
  if (address4) {
    // The IPv4 case
    var segments = address4[0].split('.');
    this.address = this.address.replace(constants4.RE_ADDRESS,
      sprintf('%s' +
        '.' +
        '%s',
        segments.slice(0, 2).join('.'),
        segments.slice(2, 4).join('.')));
  }
  if (this.elidedGroups === 0) {
    // The simple case
    return helpers.simpleGroup(this.address);
  }
  // The elided case
  var output = [];
  var halves = this.address.split('::');
  if (halves[0].length) {
    output.push(helpers.simpleGroup(halves[0]));
  } else {
    output.push('');
  }
  var classes = ['hover-group'];
  for (i = this.elisionBegin;
       i < this.elisionBegin + this.elidedGroups; i++) {
    classes.push(sprintf('group-%d', i));
  }
  output.push(sprintf('', classes.join(' ')));
  if (halves[1].length) {
    output.push(helpers.simpleGroup(halves[1], this.elisionEnd));
  } else {
    output.push('');
  }
  return output.join(':');
};