import React from "react";
import pick from "lodash/pick";

import {
  acceptProposal,
  announceProposal,
  dislike,
  hide,
  like,
  rejectProposal,
  removeDislike,
  removeLike,
} from "actions/posts";
import { ban } from "actions/users";
import ModalConfirm from "components/modals/ModalConfirm";
import PostList from "components/posts/PostList";
import { useItemActionConfirm } from "hooks";
import { PostStore } from "stores";

const PostsContainer = ({ className }) => {
  const [
    userToBan,
    setUserToBan,
    onBanUserConfirm,
    onBanUserCancel,
  ] = useItemActionConfirm(ban);
  const [
    postToHide,
    setPostToHide,
    onPostHideConfirm,
    onPostHideCancel,
  ] = useItemActionConfirm(hide);
  const [
    postToAnnounce,
    setPostToAnnounce,
    onAnnounceConfirm,
    onAnnounceCancel,
  ] = useItemActionConfirm(announceProposal);
  const [
    postToAccept,
    setPostToAccept,
    onAcceptConfirm,
    onAcceptCancel,
  ] = useItemActionConfirm(acceptProposal);
  const [
    postToReject,
    setPostToReject,
    onRejectConfirm,
    onRejectCancel,
  ] = useItemActionConfirm(rejectProposal);

  const { window, items } = PostStore.useState((state) =>
    pick(state, ["window", "items"])
  );
  const showingArchivedOnly = PostStore.useState(
    (state) => state.filters.flags === "archived"
  );

  /**
   *
   * @param {CF2021.Post} post
   */
  const onLike = (post) => {
    if (post.ranking.myVote === "none") {
      return like.run(post);
    }
    if (post.ranking.myVote === "like") {
      return removeLike.run(post);
    }
  };

  /**
   *
   * @param {CF2021.Post} post
   */
  const onDislike = (post) => {
    if (post.ranking.myVote === "none") {
      return dislike.run(post);
    }
    if (post.ranking.myVote === "dislike") {
      return removeDislike.run(post);
    }
  };

  /**
   * Ban a post's author.
   * @param {CF2021.Post} post
   */
  const onBanUser = (post) => {
    setUserToBan(post.author);
  };

  const sliceStart = (window.page - 1) * window.perPage;
  const sliceEnd = window.page * window.perPage;

  return (
    <>
      <PostList
        items={window.items
          .slice(sliceStart, sliceEnd)
          .map((postId) => items[postId])}
        onLike={onLike}
        onDislike={onDislike}
        className={className}
        dimArchived={!showingArchivedOnly}
        displayActions={true}
        onHide={setPostToHide}
        onBanUser={onBanUser}
        onAnnounceProcedureProposal={setPostToAnnounce}
        onAcceptProcedureProposal={setPostToAccept}
        onRejectProcedureProposal={setPostToReject}
      />
      <ModalConfirm
        isOpen={!!userToBan}
        onConfirm={onBanUserConfirm}
        onCancel={onBanUserCancel}
        title={`Zablokovat uživatele ${userToBan ? userToBan.name : null}?`}
        yesActionLabel="Zablokovat"
      >
        Uživatel <strong>{userToBan ? userToBan.name : null}</strong> bude
        zablokován a nebude dále moci vkládat nové příspěvky. Opravdu to chcete?
      </ModalConfirm>
      <ModalConfirm
        isOpen={!!postToHide}
        onConfirm={onPostHideConfirm}
        onCancel={onPostHideCancel}
        title="Skrýt příspěvek?"
        yesActionLabel="Potvrdit"
      >
        Příspěvek se skryje a uživatelé ho neuvidí. Opravdu to chcete?
      </ModalConfirm>
      <ModalConfirm
        isOpen={!!postToHide}
        onConfirm={onPostHideConfirm}
        onCancel={onPostHideCancel}
        title="Skrýt příspěvek?"
        yesActionLabel="Potvrdit"
      >
        Příspěvek se skryje a uživatelé ho neuvidí. Opravdu to chcete?
      </ModalConfirm>
      <ModalConfirm
        isOpen={!!postToAnnounce}
        onConfirm={onAnnounceConfirm}
        onCancel={onAnnounceCancel}
        title="Vyhlásit procedurální návrh?"
        yesActionLabel="Vyhlásit návrh"
      >
        Procedurální návrh bude <strong>vyhlášen</strong>. Opravdu to chcete?
      </ModalConfirm>
      <ModalConfirm
        isOpen={!!postToAccept}
        onConfirm={onAcceptConfirm}
        onCancel={onAcceptCancel}
        title="Schválit procedurální návrh?"
        yesActionLabel="Schválit návrh"
      >
        Procedurální návrh bude <strong>schválen</strong>. Opravdu to chcete?
      </ModalConfirm>
      <ModalConfirm
        isOpen={!!postToReject}
        onConfirm={onRejectConfirm}
        onCancel={onRejectCancel}
        title="Zamítnout procedurální návrh?"
        yesActionLabel="Zamítnout návrh"
      >
        Procedurální návrh bude <strong>zamítnut</strong>. Opravdu to chcete?
      </ModalConfirm>
    </>
  );
};

export default PostsContainer;