// 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.

import ReactDOM from "react-dom";
import Backbone from "backbone";
import _ from "lodash";

var RouteObject = function (options) {
  this._options = options;
  this.reactComponents = {};

  this._configure(options || {});
  this.initialize.apply(this, arguments);
};

/* How Route Object events work

Its now very simple. We don't want it to do much. It creates a list of routes. Then each route callback must return
a React component that will be rendered into the app

*/

// Piggy-back on Backbone's self-propagating extend function
RouteObject.extend = Backbone.Model.extend;

var routeObjectOptions = ["routes", "roles"];

_.extend(RouteObject.prototype, {
  // Should these be default vals or empty funcs?
  routes: {},
  route: function () {},
  roles: [],
  initialize: function () {}
}, {

  get: function (key) {
    return _.isFunction(this[key]) ? this[key]() : this[key];
  },

  _configure: function (options) {
    _.each(_.intersection(_.keys(options), routeObjectOptions), function (key) {
      this[key] = options[key];
    }, this);
  },

  getRouteUrls: function () {
    return _.keys(this.get('routes'));
  },

  hasRoute: function (route) {
    if (this.get('routes')[route]) {
      return true;
    }
    return false;
  },

  routeCallback: function (route, args) {
    var routes = this.get('routes'),
    routeObj = routes[route],
    routeCallback;

    if (typeof routeObj === 'object') {
      routeCallback = this[routeObj.route];
    } else {
      routeCallback = this[routeObj];
    }

    return routeCallback.apply(this, args);
  },

  getRouteRoles: function (routeUrl) {
    var route = this.get('routes')[routeUrl];

    if ((typeof route === 'object') && route.roles) {
      return route.roles;
    }

    return this.roles;
  }

});
export default RouteObject;
