"use client";

import { ArrowDownRight, Ban, MoreHorizontal, RefreshCw } from "lucide-react";
import { useContext, useState } from "react";

import { AuthUIContext } from "../../../lib/auth-ui-provider";
import type { Invitation } from "../../../types/auth-client";
import { Button } from "../../ui/button";
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuTrigger,
} from "../../ui/dropdown-menu";

interface InvitationActionMenuProps {
  invitation: Invitation;
}

export function InvitationActionMenu({
  invitation,
}: InvitationActionMenuProps) {
  const { authClient, toast } = useContext(AuthUIContext);
  const [isOpen, setIsOpen] = useState(false);
  const handleAction = async (actionType: "resendInvite" | "cancelInvite") => {
    switch (actionType) {
      case "resendInvite": {
        await authClient.organization.inviteMember(
          {
            role: invitation.role,
            email: invitation?.email,
            resend: true,
          },
          {
            onSuccess(context) {
              toast({
                message: `Invitation is resent to ${invitation?.email}`,
              });
            },
            onError(context) {
              toast({
                message: context.error.message,
                variant: "error",
              });
            },
          }
        );
        break;
      }
      case "cancelInvite": {
        await authClient.organization.cancelInvitation(
          {
            invitationId: invitation?.id,
          },
          {
            onSuccess(context) {
              toast({
                message: `Invitation with email ${invitation?.email} is canceled`,
              });
            },
            onError(context) {
              toast({
                message: context.error.message,
                variant: "error",
              });
            },
          }
        );
        break;
      }
      default: {
        return;
      }
    }
  };

  const isPending = invitation.status === "pending";

  return (
    <>
      <DropdownMenu open={isOpen} onOpenChange={setIsOpen}>
        <DropdownMenuTrigger>
          <Button
            variant="ghost"
            size="icon"
            // onClick={() => setIsOpen(true)}
            className="h-8 w-8"
          >
            <MoreHorizontal className="h-4 w-4" />
            <span className="sr-only">Open menu</span>
          </Button>
        </DropdownMenuTrigger>
        <DropdownMenuContent align="end">
          <DropdownMenuItem onClick={() => handleAction("resendInvite")}>
            <RefreshCw className="mr-2 h-4 w-4" />
            Resend Invitation
          </DropdownMenuItem>

          {isPending && (
            <DropdownMenuItem onClick={() => handleAction("cancelInvite")}>
              <Ban className="mr-2 h-4 w-4" />
              Cancel Invitation
            </DropdownMenuItem>
          )}
        </DropdownMenuContent>
      </DropdownMenu>
    </>
  );
}
