'use strict';

var hrefInfo = require('./hrefInfo');
var parseHost = require('./host');
var parsePath = require('./path');
var parsePort = require('./port');
var parseQuery = require('./query');
var parseUrlString = require('./urlstring');
var pathUtils = require('../util/path');

function parseFromUrl(url, options, fallback) {
  if (url) {
    var urlObj = parseUrl(url, options);

    // Because the following occurs in the relate stage for "to" URLs,
    // such had to be mostly duplicated here

    var pathArray = pathUtils.resolveDotSegments(urlObj.path.absolute.array);

    urlObj.path.absolute.array = pathArray;
    urlObj.path.absolute.string = '/' + pathUtils.join(pathArray);

    return urlObj;
  } else {
    return fallback;
  }
}

function parseUrl(url, options) {
  var urlObj = parseUrlString(url, options);

  if (urlObj.valid === false) return urlObj;

  parseHost(urlObj, options);
  parsePort(urlObj, options);
  parsePath(urlObj, options);
  parseQuery(urlObj, options);
  hrefInfo(urlObj);

  return urlObj;
}

module.exports = {
  from: parseFromUrl,
  to: parseUrl,
};