# Source: lib/utilities/routing.js

    'use strict';

    /**
     * returns a string that's used in an express router that's always prefixed with a preceding '/'
     *
     * @param {String} adminPath
     * @returns {String} route used for express router, that's always prefixed with a "/"
     */
    function _route_prefix(adminPath) {
      return (adminPath === '')
        ? '/'
        : (adminPath && adminPath.charAt(0) === '/')
          ? adminPath
          : '/' + adminPath;
    }

    /**
     * returns a route string without the precending '/'
     *
     * @param {String} adminPath
     * @returns {String}
     */
    function _admin_prefix(adminPath) {
      return _route_prefix(adminPath).substr(1);
    }

    /**
     * returns a route string that always has a preceding '/' and a suffixed '/', this is typically used for specifiying links to paths as absolute urls
     *
     * @param {String} adminPath
     * @returns {String}
     */
    function _manifest_prefix(adminPath) {
      var admin_prefix = _admin_prefix(adminPath);
      return (admin_prefix.length > 0)
        ? '/'+admin_prefix+'/'
        : '/';
    }

    /**
     * short hand function to return all prefix types
     *
     * @param {String} adminPath
     * @returns {String}
     */
    function all_prefixes(adminPath){
      return {
        route_prefix : _route_prefix(adminPath),
        admin_prefix : _admin_prefix(adminPath),
        manifest_prefix : _manifest_prefix(adminPath),
      };
    }

    function splitModelNameReducer(result, model_name) {
      let split = model_name.split('_');
      let parent = split.shift();
      let child = split.join('_');
      result[parent] = result[parent] || [];
      result[parent].push(child);
      return result;
    }

    function regexModelNameReducer(result, model_name) {
      let [parent, child, ] = model_name.replace(/^([^\s_]+)_{1}(.+)$/, '$1 $2').split(' ');
      result[parent] = result[parent] || [];
      result[parent].push(child);
      return result;
    }

    /**
     * Enforces the shape of an api response, by allow for three properties (result,status and data) all other properties are on data
     *
     * @param {string} options.result result of request (usually sucess or error)
     * @param {number} options.status http resonse code equivalent
     * @param {object} options.data data for response
     * @returns {object} with the shape {result,status,data}
     */
    function formatResponse(options = {}) {
      const formattedOptions = Object.keys(options).reduce((result, key) => {
        if (key === 'result') {
          result[ key ] = options[ key ].toString();
        } else if (key === 'status') {
          result[ key ] = parseInt(options[ key ], 10);
        } else if(key==='data'){
          result.data = Object.assign({},result.data,options[ key ]);
        } else {
          result.data[ key ] = options[ key ];
        }
        return result;
      }, { data: {}, });
      return Object.assign({}, {
        result: 'success',
        status: 200,
        data:{},
      }, formattedOptions);
    }

    module.exports = {
      splitModelNameReducer,
      regexModelNameReducer,
      all_prefixes,
      formatResponse,
      route_prefix : _route_prefix,
      admin_prefix : _admin_prefix,
      manifest_prefix : _manifest_prefix,
    };