import React, { useState } from "react";

import { useRouter } from "next/router";

// mobx
import { useMobxStore } from "lib/mobx/store-provider";
import { observer } from "mobx-react-lite";
// headless ui
import { Dialog, Transition } from "@headlessui/react";
// ui
import { DangerButton, SecondaryButton } from "components/ui";
// icons
import { AlertTriangle } from "lucide-react";
// types
import { ICustomAttribute } from "types";

type Props = {
  isOpen: boolean;
  objectToDelete: ICustomAttribute | null;
  onClose: () => void;
  onSubmit?: () => Promise<void>;
};

export const DeleteObjectModal: React.FC<Props> = observer(
  ({ isOpen, objectToDelete, onClose, onSubmit }) => {
    const [isDeleting, setIsDeleting] = useState(false);

    const router = useRouter();
    const { workspaceSlug } = router.query;

    const { customAttributes } = useMobxStore();

    const handleClose = () => {
      onClose();
    };

    const handleDeleteObject = async () => {
      if (!workspaceSlug || !objectToDelete) return;

      setIsDeleting(true);

      await customAttributes
        .deleteObject(workspaceSlug.toString(), objectToDelete.id)
        .then(async () => {
          if (onSubmit) await onSubmit();
          handleClose();
        })
        .finally(() => setIsDeleting(false));
    };

    return (
      <Transition.Root show={isOpen} as={React.Fragment}>
        <Dialog as="div" className="relative z-20" onClose={handleClose}>
          <Transition.Child
            as={React.Fragment}
            enter="ease-out duration-300"
            enterFrom="opacity-0"
            enterTo="opacity-100"
            leave="ease-in duration-200"
            leaveFrom="opacity-100"
            leaveTo="opacity-0"
          >
            <div className="fixed inset-0 bg-custom-backdrop bg-opacity-50 transition-opacity" />
          </Transition.Child>

          <div className="fixed inset-0 z-10 overflow-y-auto">
            <div className="flex min-h-full items-end justify-center p-4 text-center sm:items-center sm:p-0">
              <Transition.Child
                as={React.Fragment}
                enter="ease-out duration-300"
                enterFrom="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
                enterTo="opacity-100 translate-y-0 sm:scale-100"
                leave="ease-in duration-200"
                leaveFrom="opacity-100 translate-y-0 sm:scale-100"
                leaveTo="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
              >
                <Dialog.Panel className="relative transform overflow-hidden rounded-lg border border-custom-border-200 bg-custom-background-100 text-left shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-2xl">
                  <div className="flex flex-col gap-6 p-6">
                    <div className="flex w-full items-center justify-start gap-6">
                      <span className="place-items-center rounded-full bg-red-500/20 p-4">
                        <AlertTriangle className="text-red-500" size={24} strokeWidth={1.5} />
                      </span>
                      <span className="flex items-center justify-start">
                        <h3 className="text-xl font-medium 2xl:text-2xl">Delete Object</h3>
                      </span>
                    </div>
                    <span>
                      <p className="text-sm text-custom-text-200">
                        Are you sure you want to delete object{" "}
                        <span className="break-words font-medium text-custom-text-100">
                          {objectToDelete?.display_name}
                        </span>
                        ? The object will be deleted permanently and cannot be recovered.
                      </p>
                    </span>
                    <div className="flex justify-end gap-2">
                      <SecondaryButton onClick={onClose}>Cancel</SecondaryButton>
                      <DangerButton onClick={handleDeleteObject} loading={isDeleting}>
                        {isDeleting ? "Deleting..." : "Delete Object"}
                      </DangerButton>
                    </div>
                  </div>
                </Dialog.Panel>
              </Transition.Child>
            </div>
          </div>
        </Dialog>
      </Transition.Root>
    );
  }
);