/**
 * Copyright (c) HashiCorp, Inc.
 * SPDX-License-Identifier: MPL-2.0
 */

import ApplicationAdapter from '../application';

export default ApplicationAdapter.extend({
  namespace: 'v1',

  urlFor(backend, id, type = '') {
    if (type === 'ROTATE') {
      return `${this.buildURL()}/${backend}/rotate-root/${id}`;
    } else if (type === 'RESET') {
      return `${this.buildURL()}/${backend}/reset/${id}`;
    }
    let url = `${this.buildURL()}/${backend}/config`;
    if (id) {
      url = `${this.buildURL()}/${backend}/config/${id}`;
    }
    return url;
  },
  optionsForQuery(id) {
    const data = {};
    if (!id) {
      data['list'] = true;
    }
    return { data };
  },
  fetchByQuery(store, query) {
    const { backend, id } = query;
    return this.ajax(this.urlFor(backend, id), 'GET', this.optionsForQuery(id)).then((resp) => {
      resp.backend = backend;
      if (id) {
        resp.id = id;
      }
      return resp;
    });
  },
  query(store, type, query) {
    return this.fetchByQuery(store, query);
  },

  queryRecord(store, type, query) {
    return this.fetchByQuery(store, query);
  },

  createRecord(store, type, snapshot) {
    const serializer = store.serializerFor(type.modelName);
    const data = serializer.serialize(snapshot);
    const id = snapshot.attr('name');
    const backend = snapshot.attr('backend');

    return this.ajax(this.urlFor(backend, id), 'POST', { data }).then(() => {
      // ember data doesn't like 204s if it's not a DELETE
      return {
        data: {
          id,
          ...data,
        },
      };
    });
  },

  updateRecord() {
    return this.createRecord(...arguments);
  },

  deleteRecord(store, type, snapshot) {
    const id = snapshot.id;
    const backend = snapshot.attr('backend');
    return this.ajax(this.urlFor(backend, id), 'DELETE');
  },

  rotateRootCredentials(backend, id) {
    return this.ajax(this.urlFor(backend, id, 'ROTATE'), 'POST');
  },

  resetConnection(backend, id) {
    return this.ajax(this.urlFor(backend, id, 'RESET'), 'POST');
  },
});
