text: const ENCRYPTED_VALUE = '$encrypted$';
  
  let Base;
  let Project;
  let JobTemplate;
  let Inventory;
  let InventorySource;
  
  function createFormSchema (method, config) {
      if (!config) {
          config = method;
          method = 'GET';
      }
  
      const schema = Object.assign({}, this.options(`actions.${method.toUpperCase()}`));
  
      if (config && config.omit) {
          config.omit.forEach(key => delete schema[key]);
      }
  
      Object.keys(schema).forEach(key => {
          schema[key].id = key;
  
          if (this.has(key)) {
              schema[key]._value = this.get(key);
          }
      });
  
      return schema;
  }
  
  function assignInputGroupValues (inputs) {
      if (!inputs) {
          return [];
      }
  
      return inputs.map(input => {
          const value = this.get(`inputs.${input.id}`);
  
          input._value = value;
          input._encrypted = value === ENCRYPTED_VALUE;
  
          return input;
      });
  }
  
  function setDependentResources (id) {
      this.dependentResources = [
          {
              model: new Project(),
              params: {
                  credential: id
              }
          },
          {
              model: new JobTemplate(),
              params: {
                  credential: id,
                  ask_credential_on_launch: false
              }
          },
          {
              model: new Inventory(),
              params: {
                  insights_credential: id
              }
          },
          {
              model: new InventorySource(),
              params: {
                  credential: id
              }
          }
      ];
  }
  
  function CredentialModel (method, resource, config) {
      Base.call(this, 'credentials');
  
      this.Constructor = CredentialModel;
      this.createFormSchema = createFormSchema.bind(this);
      this.assignInputGroupValues = assignInputGroupValues.bind(this);
      this.setDependentResources = setDependentResources.bind(this);
  
      return this.create(method, resource, config);
  }
  
  function CredentialModelLoader (
      BaseModel,
      ProjectModel,
      JobTemplateModel,
      InventoryModel,
      InventorySourceModel
  ) {
      Base = BaseModel;
      Project = ProjectModel;
      JobTemplate = JobTemplateModel;
      Inventory = InventoryModel;
      InventorySource = InventorySourceModel;
  
      return CredentialModel;
  }
  
  CredentialModelLoader.$inject = [
      'BaseModel',
      'ProjectModel',
      'JobTemplateModel',
      'InventoryModel',
      'InventorySourceModel'
  ];
  
  export default CredentialModelLoader;
  