import {useDispatch, useSelector} from "react-redux";
import {notification} from "antd";
import {
    useAddSetMutation, useAppendLensesFromSetMutation,
    useDeleteSetMutation,
    useGetSetsQuery,
    useUpdateSetMutation
} from "../../../../../Api/setsApi.js";
import {closeModal} from "../../../../../Redux/Slices/setsSlice.js";
import {useAddSetContentMutation, useUpdateSetContentMutation} from "../../../../../Api/setContentApi.js";


const useSets = () => {
    const dispatch = useDispatch();
    const {
        selectedSet,
    } = useSelector(state => state.setsUI);

    const {data: sets = [], isLoading, isError} = useGetSetsQuery(undefined, {
        pollingInterval: 20000,
    });
    const [addSet] = useAddSetMutation();
    const [appendLensFromSet] = useAppendLensesFromSetMutation();
    const [updateSet] = useUpdateSetMutation();
    const [deleteSet] = useDeleteSetMutation();

    const [setContent] = useAddSetContentMutation();
    const [updateContent] = useUpdateSetContentMutation();

    const handleDeleteSet = async (setId) => {
        try {
            await deleteSet(setId).unwrap();
            notification.success({
                message: "Набор удален",
                description: "Набор успешно удален.",
                placement: "topRight",
            });
        } catch (error) {
            notification.error({
                message: "Ошибка удаления",
                description: error.data?.message || "Не удалось удалить набор",
                placement: "topRight",
            });
        }
    };

    const handleAppendSet = async (set) => {
        try {
            await appendLensFromSet(set.id).unwrap();
            notification.success({
                message: "Линзы добавлены",
                description: "Линзы успешно добавлены.",
                placement: "topRight",
            });
        } catch (error) {
            notification.error({
                message: "Ошибка добавления",
                description: error.data?.message || "Не удалось добавить линзы из набора в общий список",
                placement: "topRight",
            });
        }
    };

    const handleModalSetSubmit = async (set, content = []) => {
        dispatch(closeModal());

        try {
            let refreshedSet;

            if (selectedSet) {
                refreshedSet = await updateSet({id: selectedSet.id, ...set}).unwrap();
                notification.success({
                    message: "Набор обновлен",
                    description: "Набор успешно обновлен.",
                    placement: "topRight",
                });
            } else {
                refreshedSet = await addSet(set).unwrap();
                notification.success({
                    message: "Набор добавлен",
                    description: "Набор успешно добавлен.",
                    placement: "topRight",
                });
            }

            if (refreshedSet && selectedSet) {
                await updateContent({setId: refreshedSet.id, setContent: content}).unwrap();
            } else if (refreshedSet && !selectedSet) {
                await setContent({setId: refreshedSet.id, setContent: content}).unwrap();
            } else {
                notification.error({
                    message: "Ошибка",
                    description: "Не удалось сохранить содержимое набора",
                    placement: "topRight",
                });
            }
        } catch (error) {
            notification.error({
                message: "Ошибка добавления",
                description: error.data?.message || "Произошла ошибка при сохранении",
                placement: "topRight",
            });
        }
    };

    return {
        sets,
        isLoading,
        isError,
        addSet,
        updateSet,
        handleDeleteSet,
        handleAppendSet,
        handleModalSetSubmit,
    };
};

export default useSets;