import Service, { inject as service } from '@ember/service';
import builderFactory from 'consul-ui/utils/form/builder';

import kv from 'consul-ui/forms/kv';
import acl from 'consul-ui/forms/acl';
import token from 'consul-ui/forms/token';
import policy from 'consul-ui/forms/policy';
import role from 'consul-ui/forms/role';
import intention from 'consul-ui/forms/intention';
import nspace from 'consul-ui/forms/nspace';

const builder = builderFactory();

const forms = {
  kv: kv,
  acl: acl,
  token: token,
  policy: policy,
  role: role,
  intention: intention,
  nspace: nspace,
};

export default class FormService extends Service {
  // a `get` method is added via the form initializer
  // see initializers/form.js

  // TODO: Temporarily add these here until something else needs
  // dynamic repos
  @service('repository/role') role;
  @service('repository/policy') policy;
  //
  forms = [];

  build(obj, name) {
    return builder(...arguments);
  }

  form(name) {
    let form = this.forms[name];
    if (typeof form === 'undefined') {
      form = this.forms[name] = forms[name](this);
      // only do special things for our new things for the moment
      if (name === 'role' || name === 'policy') {
        const repo = this[name];
        form.clear(function(obj) {
          return repo.create(obj);
        });
        form.submit(function(obj) {
          return repo.persist(obj);
        });
      }
    }
    return form;
  }
}
