import type React from "react";
import {
  type ReactElement,
  cloneElement,
  createContext,
  useContext,
  useState,
} from "react";
import { createPortal } from "react-dom";
import { cn } from "../lib/utils";

const ModalContext = createContext(
  {} as {
    open: boolean;
    onModalChange: (open: boolean) => void;
  },
);

type ModalProps = {
  children: React.ReactNode;
  open?: boolean;
  setOpen?: (open: boolean) => void;
};

export const CustomModal: React.FC<ModalProps> = ({
  children,
  open: propOpen,
  setOpen: propSetOpen,
}) => {
  const [internalOpen, setInternalOpen] = useState(false);
  const isOpenControlled = propOpen !== undefined && propSetOpen !== undefined;
  const open = isOpenControlled ? propOpen : internalOpen;
  const setOpen = isOpenControlled ? propSetOpen : setInternalOpen;

  function onModalChange(open: boolean) {
    setOpen(open);
  }

  return (
    <ModalContext.Provider value={{ open, onModalChange }}>
      {children}
    </ModalContext.Provider>
  );
};

type WindowProps = {
  children: React.ReactNode;
  className?: string;
};

export const CustomModalWindow: React.FC<WindowProps> = ({
  children,
  className,
}) => {
  const { open } = useContext(ModalContext);

  if (!open) return null;

  return createPortal(
    <div className="fixed top-0 left-0 w-full h-screen bg-black/50 z-40 transition-all duration-500">
      <div
        className={cn(
          "fixed top-[50%] left-[50%] -translate-y-[50%] -translate-x-[50%] bg-background border-white py-8 px-8 border-[1px] w-[95%]  sm:max-w-1/2 lg:max-w-1/3 transition-all duration-500",
          className,
        )}
      >
        <div>{cloneElement(children as ReactElement)}</div>
      </div>
    </div>,
    document.body,
  );
};

Graph