

import uniq from "lodash-es/uniq";
import { observer } from "mobx-react";
import { useMemo } from "react";
// buzzwareTech package imports
import type { TActivityFilters } from "@buzzwaretech/constants";
import {
    defaultActivityFilters,
    E_SORT_ORDER,
    EUserPermissions,
} from "@buzzwaretech/constants";
import { useLocalStorage } from "@buzzwaretech/hooks";
// i18n
import { useTranslation } from "@buzzwaretech/i18n";
//types
import type { TFileSignedURLResponse, TIssueComment } from "@buzzwaretech/types";
// components
import { CommentCreate } from "@/components/comments/comment-create";
// hooks
import { useIssueDetail } from "@/hooks/store/use-issue-detail";
import { useProject } from "@/hooks/store/use-project";
import { useUser, useUserPermissions } from "@/hooks/store/user";
// buzzwareTech web components
import { ActivityFilterRoot } from "@/buzzwareTech-web/components/issues/worklog/activity/filter-root";
import { IssueActivityWorklogCreateButton } from "@/buzzwareTech-web/components/issues/worklog/activity/worklog-create-button";
import { IssueActivityCommentRoot } from "./activity-comment-root";
import { useWorkItemCommentOperations } from "./helper";
import { ActivitySortRoot } from "./sort-root";

type TIssueActivity = {
  workspaceSlug: string;
  projectId: string;
  issueId: string;
  disabled?: boolean;
  isIntakeIssue?: boolean;
};

export type TActivityOperations = {
  createComment: (data: Partial<TIssueComment>) => Promise<TIssueComment>;
  updateComment: (
    commentId: string,
    data: Partial<TIssueComment>,
  ) => Promise<void>;
  removeComment: (commentId: string) => Promise<void>;
  uploadCommentAsset: (
    blockId: string,
    file: File,
    commentId?: string,
  ) => Promise<TFileSignedURLResponse>;
};

export const IssueActivity = observer(function IssueActivity(
  props: TIssueActivity,
) {
  const {
    workspaceSlug,
    projectId,
    issueId,
    disabled = false,
    isIntakeIssue = false,
  } = props;
  // i18n
  const { t } = useTranslation();
  // hooks
  const { setValue: setFilterValue, storedValue: selectedFilters } =
    useLocalStorage("issue_activity_filters", defaultActivityFilters);
  const { setValue: setSortOrder, storedValue: sortOrder } = useLocalStorage(
    "activity_sort_order",
    E_SORT_ORDER.ASC,
  );
  // store hooks
  const {
    issue: { getIssueById },
  } = useIssueDetail();

  const { getProjectRoleByWorkspaceSlugAndProjectId } = useUserPermissions();
  const { getProjectById } = useProject();
  const { data: currentUser } = useUser();
  // derived values
  const issue = issueId ? getIssueById(issueId) : undefined;
  const currentUserProjectRole = getProjectRoleByWorkspaceSlugAndProjectId(
    workspaceSlug,
    projectId,
  );
  const isAdmin = currentUserProjectRole === EUserPermissions.ADMIN;
  const isGuest = currentUserProjectRole === EUserPermissions.GUEST;
  const isAssigned =
    issue?.assignee_ids && currentUser?.id
      ? issue?.assignee_ids.includes(currentUser?.id)
      : false;
  const isWorklogButtonEnabled =
    !isIntakeIssue && !isGuest && (isAdmin || isAssigned);
  // toggle filter
  const toggleFilter = (filter: TActivityFilters) => {
    if (!selectedFilters) return;
    let _filters = [];
    if (selectedFilters.includes(filter)) {
      if (selectedFilters.length === 1) return selectedFilters; // Ensure at least one filter is applied
      _filters = selectedFilters.filter((f) => f !== filter);
    } else {
      _filters = [...selectedFilters, filter];
    }

    setFilterValue(uniq(_filters));
  };

  const toggleSortOrder = () => {
    setSortOrder(
      sortOrder === E_SORT_ORDER.ASC ? E_SORT_ORDER.DESC : E_SORT_ORDER.ASC,
    );
  };

  // helper hooks
  const activityOperations = useWorkItemCommentOperations(
    workspaceSlug,
    projectId,
    issueId,
  );

  const project = getProjectById(projectId);
  const renderCommentCreationBox = useMemo(
    () => (
      <CommentCreate
        workspaceSlug={workspaceSlug}
        entityId={issueId}
        activityOperations={activityOperations}
        showToolbarInitially
        projectId={projectId}
      />
    ),
    [workspaceSlug, issueId, activityOperations, projectId],
  );
  if (!project) return <></>;

  return (
    <div className="space-y-4">
      {/* header */}
      <div className="flex items-center justify-between">
        <div className="text-h5-medium text-primary">
          {t("common.activity")}
        </div>
        <div className="flex items-center gap-2">
          {isWorklogButtonEnabled && (
            <IssueActivityWorklogCreateButton
              workspaceSlug={workspaceSlug}
              projectId={projectId}
              issueId={issueId}
              disabled={disabled}
            />
          )}
          <ActivitySortRoot
            sortOrder={sortOrder || E_SORT_ORDER.ASC}
            toggleSort={toggleSortOrder}
          />
          <ActivityFilterRoot
            selectedFilters={selectedFilters || defaultActivityFilters}
            toggleFilter={toggleFilter}
            isIntakeIssue={isIntakeIssue}
            projectId={projectId}
          />
        </div>
      </div>

      {/* rendering activity */}
      <div className="space-y-3">
        <div className="min-h-[200px]">
          <div className="space-y-3">
            {!disabled &&
              sortOrder === E_SORT_ORDER.DESC &&
              renderCommentCreationBox}
            <IssueActivityCommentRoot
              projectId={projectId}
              workspaceSlug={workspaceSlug}
              isIntakeIssue={isIntakeIssue}
              issueId={issueId}
              selectedFilters={selectedFilters || defaultActivityFilters}
              activityOperations={activityOperations}
              showAccessSpecifier={!!project.anchor}
              disabled={disabled}
              sortOrder={sortOrder || E_SORT_ORDER.ASC}
            />
            {!disabled &&
              sortOrder === E_SORT_ORDER.ASC &&
              renderCommentCreationBox}
          </div>
        </div>
      </div>
    </div>
  );
});
