import has from "lodash/has";
import throttle from "lodash/throttle";

import { markdownConverter } from "markdown";
import { PostStore } from "stores";
import { parseRawPost, postsStateMapping, updateWindowPosts } from "utils";

/**
 * Re-apply sorting by rank but no more than once every 3 seconds.
 */
const sortOnRankThrottled = throttle(() => {
  PostStore.update((state) => {
    if (state.filters.sort === "byScore") {
      updateWindowPosts(state);
    }
  });
}, 5000);

export const handlePostRanked = (payload) => {
  PostStore.update((state) => {
    if (state.items[payload.id]) {
      state.items[payload.id].ranking.likes = payload["ranking_likes"];
      state.items[payload.id].ranking.dislikes = payload["ranking_dislikes"];
      state.items[payload.id].ranking.score =
        state.items[payload.id].ranking.likes -
        state.items[payload.id].ranking.dislikes;
    }
  });

  // Run sorting in a throttled manner.
  sortOnRankThrottled();
};

export const handlePostChanged = (payload) => {
  PostStore.update((state) => {
    if (state.items[payload.id]) {
      if (has(payload, "content")) {
        state.items[payload.id].content = payload.content;
        state.items[payload.id].contentHtml = markdownConverter.makeHtml(
          payload.content,
        );
        state.items[payload.id].modified = true;
      }

      if (has(payload, "state")) {
        state.items[payload.id].state = postsStateMapping[payload.state];
        updateWindowPosts(state);
      }

      if (has(payload, "is_archived")) {
        state.items[payload.id].archived = payload.is_archived;
        updateWindowPosts(state);
      }
    }
  });
};

export const handlePostCreated = (payload) => {
  PostStore.update((state) => {
    state.items[payload.id] = parseRawPost(payload);
    state.itemCount = Object.keys(state.items).length;
    updateWindowPosts(state);
  });
};

export const handlePostDeleted = (payload) => {
  PostStore.update((state) => {
    delete state.items[payload.id];
    updateWindowPosts(state);
  });
};