/**
 * Creates a safe url encoded url
 *
 * @param {string[]} encoded - Pre-encoded parts for the url
 * @param {string[]} raw - Possibly unsafe (not encoded) parts for the url
 * @param {object} query - A 'query object' the values of which are possibly unsafe and will be passed through encode
 * @param {function} [encode=encodeURIComponent] - Injectable encode function, defaulting to the browser default encodeURIComponent
 *
 * @example
 * // returns 'a/nice-url/with%20some/non%20encoded?sortBy=the%20name&page=1'
 * createURL(['a/nice-url'], ['with some', 'non encoded'], {sortBy: "the name", page: 1})
 */
export default function(encoded, raw, query = {}, encode = encodeURIComponent) {
  return [
    encoded.concat(raw.map(encode)).join('/'),
    Object.keys(query)
      .map(function(key, i, arr) {
        if (query[key] != null) {
          return `${encode(key)}=${encode(query[key])}`;
        }
        return key;
      })
      .join('&'),
  ]
    .filter(item => item !== '')
    .join('?');
}