import EmberObject, { setProperties } from "@ember/object";
import Controller from "@ember/controller";
import { FORMAT } from "select-kit/components/future-date-input-selector";
import I18n from "I18n";
import ModalFunctionality from "discourse/mixins/modal-functionality";
import TopicTimer from "discourse/models/topic-timer";
import { alias } from "@ember/object/computed";
import discourseComputed from "discourse-common/utils/decorators";
import { popupAjaxError } from "discourse/lib/ajax-error";

export const CLOSE_STATUS_TYPE = "close";
export const CLOSE_AFTER_LAST_POST_STATUS_TYPE = "close_after_last_post";
export const OPEN_STATUS_TYPE = "open";
export const PUBLISH_TO_CATEGORY_STATUS_TYPE = "publish_to_category";
export const DELETE_STATUS_TYPE = "delete";
export const BUMP_TYPE = "bump";
export const DELETE_REPLIES_TYPE = "delete_replies";

export default Controller.extend(ModalFunctionality, {
  loading: false,
  isPublic: "true",

  @discourseComputed("model.closed")
  publicTimerTypes(closed) {
    let types = [
      {
        id: CLOSE_STATUS_TYPE,
        name: I18n.t(
          closed ? "topic.temp_open.title" : "topic.auto_close.title"
        ),
      },
    ];

    if (!closed) {
      types.push({
        id: CLOSE_AFTER_LAST_POST_STATUS_TYPE,
        name: I18n.t("topic.auto_close_after_last_post.title"),
      });
    }

    types.push(
      {
        id: OPEN_STATUS_TYPE,
        name: I18n.t(
          closed ? "topic.auto_reopen.title" : "topic.temp_close.title"
        ),
      },
      {
        id: PUBLISH_TO_CATEGORY_STATUS_TYPE,
        name: I18n.t("topic.publish_to_category.title"),
      },
      {
        id: BUMP_TYPE,
        name: I18n.t("topic.auto_bump.title"),
      }
    );

    if (this.currentUser.get("staff")) {
      types.push(
        {
          id: DELETE_STATUS_TYPE,
          name: I18n.t("topic.auto_delete.title"),
        },
        {
          id: DELETE_REPLIES_TYPE,
          name: I18n.t("topic.auto_delete_replies.title"),
        }
      );
    }
    return types;
  },

  topicTimer: alias("model.topic_timer"),

  _setTimer(time, durationMinutes, statusType, basedOnLastPost, categoryId) {
    this.set("loading", true);

    TopicTimer.update(
      this.get("model.id"),
      time,
      basedOnLastPost,
      statusType,
      categoryId,
      durationMinutes
    )
      .then((result) => {
        if (time || durationMinutes) {
          this.send("closeModal");

          setProperties(this.topicTimer, {
            execute_at: result.execute_at,
            duration_minutes: result.duration_minutes,
            category_id: result.category_id,
          });

          this.set("model.closed", result.closed);
        } else {
          this.set(
            "model.topic_timer",
            EmberObject.create({ status_type: this.defaultStatusType })
          );

          this.send("onChangeInput", null, null);
        }
      })
      .catch(popupAjaxError)
      .finally(() => this.set("loading", false));
  },

  onShow() {
    let time = null;
    const executeAt = this.get("topicTimer.execute_at");

    if (executeAt) {
      const closeTime = moment(executeAt);

      if (closeTime > moment()) {
        time = closeTime.format(FORMAT);
      }
    }

    this.send("onChangeInput", null, time);

    if (!this.get("topicTimer.status_type")) {
      this.send("onChangeStatusType", this.defaultStatusType);
    }

    if (
      this.get("topicTimer.status_type") === CLOSE_STATUS_TYPE &&
      this.get("topicTimer.based_on_last_post")
    ) {
      this.send("onChangeStatusType", CLOSE_AFTER_LAST_POST_STATUS_TYPE);
    }
  },

  @discourseComputed("publicTimerTypes")
  defaultStatusType(publicTimerTypes) {
    return publicTimerTypes[0].id;
  },

  actions: {
    onChangeStatusType(value) {
      this.setProperties({
        "topicTimer.based_on_last_post":
          CLOSE_AFTER_LAST_POST_STATUS_TYPE === value,
        "topicTimer.status_type": value,
      });
    },

    onChangeInput(_type, time) {
      if (moment.isMoment(time)) {
        time = time.format(FORMAT);
      }
      this.set("topicTimer.updateTime", time);
    },

    saveTimer() {
      if (
        !this.get("topicTimer.updateTime") &&
        !this.get("topicTimer.duration_minutes")
      ) {
        this.flash(
          I18n.t("topic.topic_status_update.time_frame_required"),
          "alert-error"
        );
        return;
      }

      if (
        this.get("topicTimer.duration_minutes") &&
        !this.get("topicTimer.updateTime")
      ) {
        if (this.get("topicTimer.duration_minutes") <= 0) {
          this.flash(
            I18n.t("topic.topic_status_update.min_duration"),
            "alert-error"
          );
          return;
        }

        // cannot be more than 20 years
        if (this.get("topicTimer.duration_minutes") > 20 * 365 * 1440) {
          this.flash(
            I18n.t("topic.topic_status_update.max_duration"),
            "alert-error"
          );
          return;
        }
      }

      let statusType = this.get("topicTimer.status_type");
      if (statusType === CLOSE_AFTER_LAST_POST_STATUS_TYPE) {
        statusType = CLOSE_STATUS_TYPE;
      }

      this._setTimer(
        this.get("topicTimer.updateTime"),
        this.get("topicTimer.duration_minutes"),
        statusType,
        this.get("topicTimer.based_on_last_post"),
        this.get("topicTimer.category_id")
      );
    },

    removeTimer() {
      let statusType = this.get("topicTimer.status_type");
      if (statusType === CLOSE_AFTER_LAST_POST_STATUS_TYPE) {
        statusType = CLOSE_STATUS_TYPE;
      }
      this._setTimer(null, null, statusType);
    },
  },
});
