import DiscourseRoute from "discourse/routes/discourse";
import { buildFieldTypes, buildFieldValidations } from "../lib/wizard-schema";
import EmberObject, { set } from "@ember/object";
import { A } from "@ember/array";
import { all } from "rsvp";
import { ajax } from "discourse/lib/ajax";

export default DiscourseRoute.extend({
  model() {
    return ajax("/admin/wizards/wizard");
  },

  afterModel(model) {
    buildFieldTypes(model.field_types);
    buildFieldValidations(model.realtime_validations);

    return all([
      this._getThemes(model),
      this._getApis(model),
      this._getUserFields(model),
    ]);
  },

  _getThemes(model) {
    return ajax("/admin/themes").then((result) => {
      set(
        model,
        "themes",
        result.themes.map((t) => {
          return {
            id: t.id,
            name: t.name,
          };
        })
      );
    });
  },

  _getApis(model) {
    return ajax("/admin/wizards/api").then((result) =>
      set(model, "apis", result)
    );
  },

  _getUserFields(model) {
    return this.store.findAll("user-field").then((result) => {
      if (result && result.content) {
        set(
          model,
          "userFields",
          result.content.map((f) => ({
            id: `user_field_${f.id}`,
            name: f.name,
          }))
        );
      }
    });
  },

  currentWizard() {
    const params = this.paramsFor("adminWizardsWizardShow");

    if (params && params.wizardId) {
      return params.wizardId;
    } else {
      return null;
    }
  },

  setupController(controller, model) {
    controller.setProperties({
      wizardList: model.wizard_list,
      wizardId: this.currentWizard(),
      custom_fields: A(model.custom_fields.map((f) => EmberObject.create(f))),
    });
  },

  actions: {
    changeWizard(wizardId) {
      this.controllerFor("adminWizardsWizard").set("wizardId", wizardId);

      if (wizardId) {
        this.transitionTo("adminWizardsWizardShow", wizardId);
      } else {
        this.transitionTo("adminWizardsWizard");
      }
    },

    afterDestroy() {
      this.transitionTo("adminWizardsWizard").then(() => this.refresh());
    },

    afterSave(wizardId) {
      this.refresh().then(() => this.send("changeWizard", wizardId));
    },

    createWizard() {
      this.controllerFor("adminWizardsWizard").set("wizardId", "create");
      this.transitionTo("adminWizardsWizardShow", "create");
    },
  },
});