import EmberObject from "@ember/object";
import discourseComputed from "discourse-common/utils/decorators";
import ValidState from "wizard/mixins/valid-state";
import { ajax } from "wizard/lib/ajax";

export default EmberObject.extend(ValidState, {
  id: null,

  @discourseComputed("index")
  displayIndex: index => index + 1,

  @discourseComputed("fields.[]")
  fieldsById(fields) {
    const lookup = {};
    fields.forEach(field => (lookup[field.get("id")] = field));
    return lookup;
  },

  validate() {
    let allValid = true;
    const result = { warnings: [] };

    this.fields.forEach(field => {
      allValid = allValid && field.check();
      const warning = field.get("warning");
      if (warning) {
        result.warnings.push(warning);
      }
    });

    this.setValid(allValid);

    return result;
  },

  fieldError(id, description) {
    const field = this.fields.findBy("id", id);
    if (field) {
      field.setValid(false, description);
    }
  },

  save() {
    const fields = {};
    this.fields.forEach(f => (fields[f.id] = f.value));

    return ajax({
      url: `/wizard/steps/${this.id}`,
      type: "PUT",
      data: { fields }
    }).catch(response => {
      response.responseJSON.errors.forEach(err =>
        this.fieldError(err.field, err.description)
      );
      throw new Error(response);
    });
  }
});
