import { Plus } from "lucide-react";

import { BrandNodeProps, NodeProps } from "./types";

import { newWorkflowNode, workflowNodeDropdownList, WorkflowNodeType } from "@/domain/workflow";
import { useWorkflowStore, WorkflowState } from "@/providers/workflow";
import { useShallow } from "zustand/shallow";
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuLabel,
  DropdownMenuPortal,
  DropdownMenuSeparator,
  DropdownMenuSub,
  DropdownMenuSubContent,
  DropdownMenuSubTrigger,
  DropdownMenuTrigger,
} from "../ui/dropdown-menu";
import DropdownMenuItemIcon from "./DropdownMenuItemIcon";
import Show from "../Show";
import { useTranslation } from "react-i18next";

const selectState = (state: WorkflowState) => ({
  addNode: state.addNode,
});

const AddNode = ({ data }: NodeProps | BrandNodeProps) => {
  const { addNode } = useWorkflowStore(useShallow(selectState));
  const { t } = useTranslation();

  const handleTypeSelected = (type: WorkflowNodeType, provider?: string) => {
    const node = newWorkflowNode(type, {
      providerType: provider,
    });

    addNode(node, data.id);
  };

  return (
    <div className="before:content-['']  before:w-[2px] before:bg-stone-200 before:absolute before:h-full before:left-[50%] before:-translate-x-[50%] before:top-0 pt-6 pb-9 relative flex flex-col items-center">
      <DropdownMenu>
        <DropdownMenuTrigger className="">
          <div className="bg-stone-400 hover:bg-stone-500 rounded-full z-10 relative outline-none">
            <Plus size={18} className="text-white" />
          </div>
        </DropdownMenuTrigger>
        <DropdownMenuContent>
          <DropdownMenuLabel>{t("workflow.node.selectNodeType.label")}</DropdownMenuLabel>
          <DropdownMenuSeparator />
          {workflowNodeDropdownList.map((item) => (
            <Show
              key={item.type}
              when={!!item.leaf}
              fallback={
                <DropdownMenuSub>
                  <DropdownMenuSubTrigger className="flex space-x-2">
                    <DropdownMenuItemIcon type={item.icon.type} name={item.icon.name} /> <div>{item.name}</div>
                  </DropdownMenuSubTrigger>
                  <DropdownMenuPortal>
                    <DropdownMenuSubContent>
                      {item.children?.map((subItem) => {
                        return (
                          <DropdownMenuItem
                            key={subItem.providerType}
                            className="flex space-x-2"
                            onClick={() => {
                              handleTypeSelected(item.type, subItem.providerType);
                            }}
                          >
                            <DropdownMenuItemIcon type={subItem.icon.type} name={subItem.icon.name} /> <div>{subItem.name}</div>
                          </DropdownMenuItem>
                        );
                      })}
                    </DropdownMenuSubContent>
                  </DropdownMenuPortal>
                </DropdownMenuSub>
              }
            >
              <DropdownMenuItem
                key={item.type}
                className="flex space-x-2"
                onClick={() => {
                  handleTypeSelected(item.type, item.providerType);
                }}
              >
                <DropdownMenuItemIcon type={item.icon.type} name={item.icon.name} /> <div>{item.name}</div>
              </DropdownMenuItem>
            </Show>
          ))}
        </DropdownMenuContent>
      </DropdownMenu>
    </div>
  );
};

export default AddNode;