'use strict';

////////////////////////////////////////////////////////////////////////////////
/// DISCLAIMER
///
/// Copyright 2015-2016 ArangoDB GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
///     http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is ArangoDB GmbH, Cologne, Germany
///
/// @author Alan Plum
////////////////////////////////////////////////////////////////////////////////

const joi = require('joi');
const DEFAULT_PARAM_SCHEMA = joi.string().required();

const $_WILDCARD = Symbol.for('@@wildcard'); // catch-all suffix
const $_TERMINAL = Symbol.for('@@terminal'); // terminal -- routes be here
const $_PARAM = Symbol.for('@@parameter'); // named parameter (no routes here, like static part)

function reverse(pathTokens, pathParamNames) {
  const path = [];
  let i = 0;
  for (const token of pathTokens) {
    if (token === $_PARAM) {
      path.push(':' + pathParamNames[i]);
      i++;
    } else if (token === $_WILDCARD) {
      path.push('*');
    } else if (token !== $_TERMINAL) {
      path.push(token);
    }
  }
  return '/' + path.join('/');
}

module.exports = Object.assign(
  function tokenize(path, ctx) {
    if (path === '/') {
      return [$_TERMINAL];
    }
    const tokens = path.slice(1).split('/').map((name) => {
      if (name === '*') {
        return $_WILDCARD;
      }
      if (name.charAt(0) !== ':') {
        return name;
      }
      name = name.slice(1);
      ctx._pathParamNames.push(name);
      ctx.pathParam(name, DEFAULT_PARAM_SCHEMA);
      return $_PARAM;
    });
    if (tokens[tokens.length - 1] !== $_WILDCARD) {
      tokens.push($_TERMINAL);
    }
    return tokens;
  }, {
    WILDCARD: $_WILDCARD,
    TERMINAL: $_TERMINAL,
    PARAM: $_PARAM,
    reverse: reverse
  }
);

@@ -1972,16 +1972,17 @@
     ctx.
+_
 pathPara
@@ -1986,14 +1986,28 @@
 aram
+s.set
 (name,
+ %7Bschema:
  DEF
@@ -2023,16 +2023,17 @@
 M_SCHEMA
+%7D
 );%0A     

Fix mounting with pathParams