/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 Ember from 'ember';
import DS from 'ember-data';

export default DS.JSONAPIAdapter.extend({
  address: null, //Must be set by inheriting classes
  restNameSpace: null, //Must be set by inheriting classes
  serverName: null, //Must be set by inheriting classes

  headers: {
    Accept: 'application/json'
  },

  host: Ember.computed("address", function () {
    var address = this.get("address");
    return this.get(`hosts.${address}`);
  }),

  namespace: Ember.computed("restNameSpace", function () {
    var serverName = this.get("restNameSpace");
    return this.get(`env.app.namespaces.${serverName}`);
  }),

  ajax: function(url, method, options) {
    options = options || {};
    options.crossDomain = true;
    options.xhrFields = {
      withCredentials: true
    };
    options.targetServer = this.get('serverName');
    return this._super(url, method, options);
  }
});