import React from "react";
// react beautiful dnd
import { Droppable } from "@hello-pangea/dnd";
// components
import { KanBanGroupByHeaderRoot } from "./headers/group-by-root";
import { IssueBlock } from "./block";
// constants
import { ISSUE_STATE_GROUPS, ISSUE_PRIORITIES, getValueFromObject } from "constants/issue";
// mobx
import { observer } from "mobx-react-lite";
// mobx
import { useMobxStore } from "lib/mobx/store-provider";
import { RootStore } from "store/root";

export interface IGroupByKanBan {
  issues: any;
  sub_group_by: string | null;
  group_by: string | null;
  sub_group_id: string;
  list: any;
  listKey: string;
  isDragDisabled: boolean;
  handleIssues?: (sub_group_by: string | null, group_by: string | null, issue: any) => void;
  display_properties: any;
  kanBanToggle: any;
  handleKanBanToggle: any;
}

const GroupByKanBan: React.FC<IGroupByKanBan> = observer(
  ({
    issues,
    sub_group_by,
    group_by,
    sub_group_id = "null",
    list,
    listKey,
    isDragDisabled,
    handleIssues,
    display_properties,
    kanBanToggle,
    handleKanBanToggle,
  }) => {
    const verticalAlignPosition = (_list: any) =>
      kanBanToggle?.groupByHeaderMinMax.includes(getValueFromObject(_list, listKey) as string);

    return (
      <div className="relative w-full h-full flex">
        {list &&
          list.length > 0 &&
          list.map((_list: any) => (
            <div className={`flex-shrink-0 flex flex-col ${!verticalAlignPosition(_list) ? `w-[340px]` : ``}`}>
              {sub_group_by === null && (
                <div className="flex-shrink-0 w-full bg-custom-background-90 py-1 sticky top-0 z-[2]">
                  <KanBanGroupByHeaderRoot
                    column_id={getValueFromObject(_list, listKey) as string}
                    sub_group_by={sub_group_by}
                    group_by={group_by}
                    issues_count={issues?.[getValueFromObject(_list, listKey) as string]?.length || 0}
                    kanBanToggle={kanBanToggle}
                    handleKanBanToggle={handleKanBanToggle}
                  />
                </div>
              )}

              <div
                className={`min-h-[150px] h-full ${
                  verticalAlignPosition(_list) ? `w-[0px] overflow-hidden` : `w-full transition-all`
                }`}
              >
                <Droppable droppableId={`${getValueFromObject(_list, listKey) as string}__${sub_group_id}`}>
                  {(provided: any, snapshot: any) => (
                    <div
                      className={`w-full h-full relative transition-all ${
                        snapshot.isDraggingOver ? `bg-custom-background-80` : ``
                      }`}
                      {...provided.droppableProps}
                      ref={provided.innerRef}
                    >
                      {issues ? (
                        <IssueBlock
                          sub_group_id={sub_group_id}
                          columnId={getValueFromObject(_list, listKey) as string}
                          issues={issues[getValueFromObject(_list, listKey) as string]}
                          isDragDisabled={isDragDisabled}
                          handleIssues={handleIssues}
                          display_properties={display_properties}
                        />
                      ) : (
                        isDragDisabled && (
                          <div className="absolute top-0 left-0 w-full h-full flex items-center justify-center">
                            {/* <div className="text-custom-text-300 text-sm">Drop here</div> */}
                          </div>
                        )
                      )}
                      {provided.placeholder}
                    </div>
                  )}
                </Droppable>
              </div>
            </div>
          ))}
      </div>
    );
  }
);

export interface IKanBan {
  issues: any;
  sub_group_by: string | null;
  group_by: string | null;
  sub_group_id?: string;
  handleDragDrop?: (result: any) => void | undefined;
  handleIssues?: (sub_group_by: string | null, group_by: string | null, issue: any) => void;
  display_properties: any;
  kanBanToggle: any;
  handleKanBanToggle: any;
}

export const KanBan: React.FC<IKanBan> = observer(
  ({
    issues,
    sub_group_by,
    group_by,
    sub_group_id = "null",
    handleIssues,
    display_properties,
    kanBanToggle,
    handleKanBanToggle,
  }) => {
    const { project: projectStore, issueKanBanView: issueKanBanViewStore }: RootStore = useMobxStore();

    return (
      <div className="relative w-full h-full">
        {group_by && group_by === "state" && (
          <GroupByKanBan
            issues={issues}
            group_by={group_by}
            sub_group_by={sub_group_by}
            sub_group_id={sub_group_id}
            list={projectStore?.projectStates}
            listKey={`id`}
            isDragDisabled={!issueKanBanViewStore?.canUserDragDrop}
            handleIssues={handleIssues}
            display_properties={display_properties}
            kanBanToggle={kanBanToggle}
            handleKanBanToggle={handleKanBanToggle}
          />
        )}

        {group_by && group_by === "state_detail.group" && (
          <GroupByKanBan
            issues={issues}
            group_by={group_by}
            sub_group_by={sub_group_by}
            sub_group_id={sub_group_id}
            list={ISSUE_STATE_GROUPS}
            listKey={`key`}
            isDragDisabled={!issueKanBanViewStore?.canUserDragDrop}
            handleIssues={handleIssues}
            display_properties={display_properties}
            kanBanToggle={kanBanToggle}
            handleKanBanToggle={handleKanBanToggle}
          />
        )}

        {group_by && group_by === "priority" && (
          <GroupByKanBan
            issues={issues}
            group_by={group_by}
            sub_group_by={sub_group_by}
            sub_group_id={sub_group_id}
            list={ISSUE_PRIORITIES}
            listKey={`key`}
            isDragDisabled={!issueKanBanViewStore?.canUserDragDrop}
            handleIssues={handleIssues}
            display_properties={display_properties}
            kanBanToggle={kanBanToggle}
            handleKanBanToggle={handleKanBanToggle}
          />
        )}

        {group_by && group_by === "labels" && (
          <GroupByKanBan
            issues={issues}
            group_by={group_by}
            sub_group_by={sub_group_by}
            sub_group_id={sub_group_id}
            list={projectStore?.projectLabels}
            listKey={`id`}
            isDragDisabled={!issueKanBanViewStore?.canUserDragDrop}
            handleIssues={handleIssues}
            display_properties={display_properties}
            kanBanToggle={kanBanToggle}
            handleKanBanToggle={handleKanBanToggle}
          />
        )}

        {group_by && group_by === "assignees" && (
          <GroupByKanBan
            issues={issues}
            group_by={group_by}
            sub_group_by={sub_group_by}
            sub_group_id={sub_group_id}
            list={projectStore?.projectMembers}
            listKey={`member.id`}
            isDragDisabled={!issueKanBanViewStore?.canUserDragDrop}
            handleIssues={handleIssues}
            display_properties={display_properties}
            kanBanToggle={kanBanToggle}
            handleKanBanToggle={handleKanBanToggle}
          />
        )}

        {group_by && group_by === "created_by" && (
          <GroupByKanBan
            issues={issues}
            group_by={group_by}
            sub_group_by={sub_group_by}
            sub_group_id={sub_group_id}
            list={projectStore?.projectMembers}
            listKey={`member.id`}
            isDragDisabled={!issueKanBanViewStore?.canUserDragDrop}
            handleIssues={handleIssues}
            display_properties={display_properties}
            kanBanToggle={kanBanToggle}
            handleKanBanToggle={handleKanBanToggle}
          />
        )}
      </div>
    );
  }
);