import DiscourseURL from "discourse/lib/url";
import { withPluginApi } from "discourse/lib/plugin-api";
import getUrl from "discourse-common/lib/get-url";
import { observes } from "discourse-common/utils/decorators";
import { dasherize } from "@ember/string";

export default {
  name: "custom-wizard-edits",
  initialize(container) {
    const siteSettings = container.lookup("service:site-settings");

    if (!siteSettings.custom_wizard_enabled) {
      return;
    }

    withPluginApi("0.8.36", (api) => {
      api.onAppEvent("page:changed", (data) => {
        const currentUser = container.lookup("service:current-user");
        const settings = container.lookup("service:site-settings");
        if (currentUser) {
          const redirectToWizard = currentUser.redirect_to_wizard;
          const excludedPaths = settings.wizard_redirect_exclude_paths
            .split("|")
            .concat(["loading"]);
          if (
            redirectToWizard &&
            data.currentRouteName !== "customWizardStep" &&
            !excludedPaths.find((p) => {
              return data.currentRouteName.indexOf(p) > -1;
            })
          ) {
            DiscourseURL.routeTo(`/w/${dasherize(redirectToWizard)}`);
          }
        }
      });

      api.modifyClass("component:d-navigation", {
        pluginId: "custom-wizard",
        actions: {
          clickCreateTopicButton() {
            let createTopicWizard = this.get(
              "category.custom_fields.create_topic_wizard"
            );
            if (createTopicWizard) {
              window.location.href = getUrl(`/w/${createTopicWizard}`);
            } else {
              this._super();
            }
          },
        },
      });

      api.modifyClass("component:uppy-image-uploader", {
        pluginId: "custom-wizard",
        // Needed to ensure appEvents get registered when navigating between steps
        @observes("id")
        initOnStepChange() {
          if (/wizard-field|wizard-step/.test(this.id)) {
            this._initialize();
          }
        },
      });

      api.modifyClass("component:d-editor", {
        pluginId: "custom-wizard",

        didInsertElement() {
          this._super(...arguments);

          if (this.wizardComposer) {
            this.appEvents.on(
              `wizard-editor:insert-text`,
              this,
              "_wizardInsertText"
            );
            this.appEvents.on(
              "wizard-editor:replace-text",
              this,
              "_wizardReplaceText"
            );
          }
        },

        _wizardInsertText(text, options) {
          if (
            this.session.wizardEventFieldId === this.fieldId &&
            this.element
          ) {
            this.insertText(text, options);
          }
        },

        _wizardReplaceText(oldVal, newVal, opts = {}) {
          if (this.session.wizardEventFieldId === this.fieldId) {
            this.replaceText(oldVal, newVal, opts);
          }
        },
      });
    });
  },
};