/**
 * Copyright (c) HashiCorp, Inc.
 * SPDX-License-Identifier: BUSL-1.1
 */

import { assert } from '@ember/debug';
import { encodePath } from 'vault/utils/path-encoding-helpers';
import ApplicationAdapter from '../application';

export default class PkiActionAdapter extends ApplicationAdapter {
  namespace = 'v1';

  urlForCreateRecord(modelName, snapshot) {
    const { type } = snapshot.record;
    const { actionType, useIssuer, issuerRef, mount } = snapshot.adapterOptions;
    // if the backend mount is passed, we want that to override the URL's mount path
    const backend = mount || snapshot.record.backend;
    if (!backend || !actionType) {
      throw new Error('URL for create record is missing required attributes');
    }
    const baseUrl = `${this.buildURL()}/${encodePath(backend)}`;
    switch (actionType) {
      case 'import':
        return useIssuer ? `${baseUrl}/issuers/import/bundle` : `${baseUrl}/config/ca`;
      case 'generate-root':
        return useIssuer ? `${baseUrl}/issuers/generate/root/${type}` : `${baseUrl}/root/generate/${type}`;
      case 'generate-csr':
        return useIssuer
          ? `${baseUrl}/issuers/generate/intermediate/${type}`
          : `${baseUrl}/intermediate/generate/${type}`;
      case 'sign-intermediate':
        return `${baseUrl}/issuer/${encodePath(issuerRef)}/sign-intermediate`;
      case 'rotate-root':
        return `${baseUrl}/root/rotate/${type}`;
      default:
        assert('actionType must be one of import, generate-root, generate-csr or sign-intermediate');
    }
  }

  createRecord(store, type, snapshot) {
    const serializer = store.serializerFor(type.modelName);
    const url = this.urlForCreateRecord(type.modelName, snapshot);
    // Send actionType as serializer requestType so that we serialize data based on the endpoint
    const data = serializer.serialize(snapshot, snapshot.adapterOptions.actionType);
    return this.ajax(url, 'POST', { data }).then((result) => ({
      // pki/action endpoints don't correspond with a single specific entity,
      // so in ember-data we'll map it to the request ID
      id: result.request_id,
      ...result,
    }));
  }
}
