import discourseComputed from "discourse-common/utils/decorators";
import Controller, { inject } from "@ember/controller";
import { setting } from "discourse/lib/computed";
import { computed } from "@ember/object";
import AdminDashboard from "admin/models/admin-dashboard";
import VersionCheck from "admin/models/version-check";

const PROBLEMS_CHECK_MINUTES = 1;

export default Controller.extend({
  isLoading: false,
  dashboardFetchedAt: null,
  exceptionController: inject("exception"),
  showVersionChecks: setting("version_checks"),

  @discourseComputed("problems.length")
  foundProblems(problemsLength) {
    return this.currentUser.get("admin") && (problemsLength || 0) > 0;
  },

  visibleTabs: computed("siteSettings.dashboard_visible_tabs", function() {
    return (this.siteSettings.dashboard_visible_tabs || "")
      .split("|")
      .filter(Boolean);
  }),

  isModerationTabVisible: computed("visibleTabs", function() {
    return this.visibleTabs.includes("moderation");
  }),

  isSecurityTabVisible: computed("visibleTabs", function() {
    return this.visibleTabs.includes("security");
  }),

  isReportsTabVisible: computed("visibleTabs", function() {
    return this.visibleTabs.includes("reports");
  }),

  fetchProblems() {
    if (this.isLoadingProblems) return;

    if (
      !this.problemsFetchedAt ||
      moment()
        .subtract(PROBLEMS_CHECK_MINUTES, "minutes")
        .toDate() > this.problemsFetchedAt
    ) {
      this._loadProblems();
    }
  },

  fetchDashboard() {
    const versionChecks = this.siteSettings.version_checks;

    if (this.isLoading || !versionChecks) return;

    if (
      !this.dashboardFetchedAt ||
      moment()
        .subtract(30, "minutes")
        .toDate() > this.dashboardFetchedAt
    ) {
      this.set("isLoading", true);

      AdminDashboard.fetch()
        .then(model => {
          let properties = {
            dashboardFetchedAt: new Date()
          };

          if (versionChecks) {
            properties.versionCheck = VersionCheck.create(model.version_check);
          }

          this.setProperties(properties);
        })
        .catch(e => {
          this.exceptionController.set("thrown", e.jqXHR);
          this.replaceRoute("exception");
        })
        .finally(() => {
          this.set("isLoading", false);
        });
    }
  },

  _loadProblems() {
    this.setProperties({
      loadingProblems: true,
      problemsFetchedAt: new Date()
    });

    AdminDashboard.fetchProblems()
      .then(model => this.set("problems", model.problems))
      .finally(() => this.set("loadingProblems", false));
  },

  @discourseComputed("problemsFetchedAt")
  problemsTimestamp(problemsFetchedAt) {
    return moment(problemsFetchedAt)
      .locale("en")
      .format("LLL");
  },

  actions: {
    refreshProblems() {
      this._loadProblems();
    }
  }
});
