"use client";

import {
  createContext,
  useCallback,
  useContext,
  useMemo,
  useState,
  type ReactNode,
} from "react";
import { ConfirmModal } from "@/app/components/ui/confirm-modal";
import { SuccessModal } from "@/app/components/ui/success-modal";

type DeleteConfirmOptions = {
  description?: string;
  title?: string;
  onConfirm: () => void | Promise<void>;
};

type SaveSuccessOptions = {
  description: string;
  onPrimary?: () => void;
  onClose?: () => void;
};

type FeedbackModalContextValue = {
  showDeleteConfirm: (options: DeleteConfirmOptions) => void;
  showSaveSuccess: (options: SaveSuccessOptions) => void;
  hideDeleteConfirm: () => void;
  hideSaveSuccess: () => void;
};

const defaultDeleteConfirm = {
  title: "Apakah Anda yakin ingin menghapus data ini?",
  description: "Tindakan ini tidak dapat dibatalkan.",
};

const FeedbackModalContext = createContext<FeedbackModalContextValue | null>(null);

export function FeedbackModalProvider({ children }: { children: ReactNode }) {
  const [confirmState, setConfirmState] = useState<DeleteConfirmOptions | null>(null);
  const [successState, setSuccessState] = useState<SaveSuccessOptions | null>(null);
  const [isConfirmSubmitting, setIsConfirmSubmitting] = useState(false);

  const showDeleteConfirm = useCallback((options: DeleteConfirmOptions) => {
    setConfirmState(options);
  }, []);

  const hideDeleteConfirm = useCallback(() => {
    if (isConfirmSubmitting) return;
    setConfirmState(null);
  }, [isConfirmSubmitting]);

  const showSaveSuccess = useCallback((options: SaveSuccessOptions) => {
    setSuccessState(options);
  }, []);

  const hideSaveSuccess = useCallback(() => {
    setSuccessState(null);
  }, []);

  const handleConfirm = useCallback(async () => {
    if (!confirmState || isConfirmSubmitting) return;

    setIsConfirmSubmitting(true);

    try {
      await confirmState.onConfirm();
      setConfirmState(null);
    } finally {
      setIsConfirmSubmitting(false);
    }
  }, [confirmState, isConfirmSubmitting]);

  const handleSuccessClose = useCallback(() => {
    successState?.onClose?.();
    setSuccessState(null);
  }, [successState]);

  const handleSuccessPrimary = useCallback(() => {
    successState?.onPrimary?.();
    setSuccessState(null);
  }, [successState]);

  const value = useMemo(
    () => ({
      showDeleteConfirm,
      showSaveSuccess,
      hideDeleteConfirm,
      hideSaveSuccess,
    }),
    [showDeleteConfirm, showSaveSuccess, hideDeleteConfirm, hideSaveSuccess],
  );

  return (
    <FeedbackModalContext.Provider value={value}>
      {children}

      <ConfirmModal
        open={confirmState !== null}
        title={confirmState?.title ?? defaultDeleteConfirm.title}
        description={confirmState?.description ?? defaultDeleteConfirm.description}
        isSubmitting={isConfirmSubmitting}
        onClose={hideDeleteConfirm}
        onConfirm={handleConfirm}
        ariaLabel="Konfirmasi hapus data"
      />

      <SuccessModal
        open={successState !== null}
        description={successState?.description ?? ""}
        onClose={handleSuccessClose}
        onPrimary={handleSuccessPrimary}
        ariaLabel="Berhasil menyimpan data"
      />
    </FeedbackModalContext.Provider>
  );
}

export function useFeedbackModal() {
  const context = useContext(FeedbackModalContext);

  if (!context) {
    throw new Error("useFeedbackModal harus dipakai di dalam FeedbackModalProvider");
  }

  return context;
}
