import { observer } from "mobx-react-lite";
import { ChevronDown } from "lucide-react";
// hooks
import { useMember } from "hooks/store";
// ui
import { Avatar, AvatarGroup, UserGroupIcon } from "@plane/ui";
// helpers
import { cn } from "helpers/common.helper";

type ButtonProps = {
  className?: string;
  dropdownArrow: boolean;
  placeholder: string;
  hideText?: boolean;
  userIds: string | string[] | null;
};

const ButtonAvatars = observer(({ userIds }: { userIds: string | string[] | null }) => {
  const { getUserDetails } = useMember();

  if (Array.isArray(userIds)) {
    if (userIds.length > 0)
      return (
        <AvatarGroup size="md">
          {userIds.map((userId) => {
            const userDetails = getUserDetails(userId);

            if (!userDetails) return;
            return <Avatar key={userId} src={userDetails.avatar} name={userDetails.display_name} />;
          })}
        </AvatarGroup>
      );
  } else {
    if (userIds) {
      const userDetails = getUserDetails(userIds);
      return <Avatar src={userDetails?.avatar} name={userDetails?.display_name} size="md" />;
    }
  }

  return <UserGroupIcon className="h-3 w-3 flex-shrink-0" />;
});

export const BorderButton = observer((props: ButtonProps) => {
  const { className, dropdownArrow, hideText = false, placeholder, userIds } = props;
  // store hooks
  const { getUserDetails } = useMember();

  const isMultiple = Array.isArray(userIds);

  return (
    <div
      className={cn(
        "h-full flex items-center gap-1.5 border-[0.5px] border-custom-border-300 hover:bg-custom-background-80 rounded text-xs px-2 py-0.5",
        className
      )}
    >
      <ButtonAvatars userIds={userIds} />
      {!hideText && (
        <span className="flex-grow truncate">
          {userIds ? (isMultiple ? placeholder : getUserDetails(userIds)?.display_name) : placeholder}
        </span>
      )}
      {dropdownArrow && <ChevronDown className="h-2.5 w-2.5 flex-shrink-0" aria-hidden="true" />}
    </div>
  );
});

export const BackgroundButton = observer((props: ButtonProps) => {
  const { className, dropdownArrow, hideText = false, placeholder, userIds } = props;
  // store hooks
  const { getUserDetails } = useMember();

  const isMultiple = Array.isArray(userIds);

  return (
    <div
      className={cn("h-full flex items-center gap-1.5 rounded text-xs px-2 py-0.5 bg-custom-background-80", className)}
    >
      <ButtonAvatars userIds={userIds} />
      {!hideText && (
        <span className="flex-grow truncate">
          {userIds ? (isMultiple ? placeholder : getUserDetails(userIds)?.display_name) : placeholder}
        </span>
      )}
      {dropdownArrow && <ChevronDown className="h-2.5 w-2.5 flex-shrink-0" aria-hidden="true" />}
    </div>
  );
});

export const TransparentButton = observer((props: ButtonProps) => {
  const { className, dropdownArrow, hideText = false, placeholder, userIds } = props;
  // store hooks
  const { getUserDetails } = useMember();

  const isMultiple = Array.isArray(userIds);

  return (
    <div
      className={cn(
        "h-full flex items-center gap-1.5 rounded text-xs px-2 py-0.5 hover:bg-custom-background-80",
        className
      )}
    >
      <ButtonAvatars userIds={userIds} />
      {!hideText && (
        <span className="flex-grow truncate">
          {userIds ? (isMultiple ? placeholder : getUserDetails(userIds)?.display_name) : placeholder}
        </span>
      )}
      {dropdownArrow && <ChevronDown className="h-2.5 w-2.5 flex-shrink-0" aria-hidden="true" />}
    </div>
  );
});