import { useState, useEffect } from 'react';
import sectionService from '../services/serviceSections';
import { MEDIA_URL } from '../../../../utils/Constant';

const useSections = () => {
    const thumbPath = `${MEDIA_URL}/section/`;
    const [sections, setSections] = useState([]);
    const [loading, setLoading] = useState(true);
    const [error, setError] = useState(null);
    const [selectedSection, setSelectedSection] = useState(null);
    const [selectedImage, setSelectedImage] = useState(null);
    const [formData, setFormData] = useState({
        sectionName: '',
        description:  '',
        thumbnail: ''
    });
    const [show, setShow] = useState(false);
    const [showLoader, setShowLoader] = useState(false);
    const [loaderState, setLoaderState] = useState({ loading: false, successMessage: '', title: '', description: '', confirmAction: false });

    const handleFormChange = (e) => {
        setFormData({ ...formData, [e.target.name]: e.target.value });
    };
    const handleImageChange = (e) => {
        const file = e.target.files[0];
        if (file && file.size <= 5 * 1024 * 1024) {
          setSelectedImage(file);
        } else {
          setError('File size must be less than 5 MB');
        }
    };

    const handleShow = (data) => {
        setSelectedSection(data);
        setFormData({
            sectionName: data?.NAME_SECTION || '',
            description: data?.DESCRIPTION_SECTION || '',
            thumbnail: data?.THUMBNAIL || '',
        });
        setShow(true);
    };
    const handleClose = () => {setShow(false); resetForm(); setSelectedSection(null)};
    
    const handleCloseLoader = () => setShowLoader(false);
    const handleShowLoader = (title, description, loading = false, successMessage = '', confirmAction = false) => {
        setLoaderState({ title, description, loading, successMessage, confirmAction });
        setShowLoader(true);
    };

    const resetForm = () =>{
        setSelectedImage(null);
        setFormData({
            sectionName: '',
            description:  '',
            thumbnail: ''
        });
    }

    const createSection = async () => {
        const createData = new FormData();
        createData.append('NAME_SECTION', formData.sectionName,);
        createData.append('DESCRIPTION_SECTION', formData.description,);
        if (selectedImage) {
            createData.append('THUMBNAIL', selectedImage);
        }

        handleShowLoader('Created', '', true);
        try {
            const createdSection = await sectionService.createData(createData);
            setSections((prevSections) => [...prevSections, createdSection.payload]);
            resetForm();
            setLoaderState(prev => ({
                ...prev,
                loading: false,
                successMessage: 'Your new entry has been successfully created and saved.'
            }));
        } catch (err) {
            setError(err);
            setLoaderState(prev => ({
                ...prev,
                title: "ERROR",
                loading: false,
                successMessage: err.message
            }));
        }
    };

    const editSection = async () => {
        const id = selectedSection.ID_SECTION

        const updateData = new FormData();
        updateData.append('NAME_SECTION', formData.sectionName,);
        updateData.append('DESCRIPTION_SECTION', formData.description,);
        if (selectedImage) {
            updateData.append('THUMBNAIL', selectedImage);
        }

        handleClose();
        handleShowLoader('Updated', '', true);
        try {
            const section = await sectionService.updateData(id, updateData);
            setSections((prevSections) => 
                prevSections.map((s) => (s.ID_SECTION === id ? section.payload : s))
            );
            setLoaderState(prev => ({
                ...prev,
                loading: false,
                successMessage: 'Your data has been successfully updated.'
            }));
        } catch (err) {
            setLoaderState(prev => ({
                ...prev,
                title: "ERROR",
                loading: false,
                successMessage: err.response.data.message
            }));
        }
    };

    const deleteSection = async (id) => {
        handleShowLoader('Deleted', 'Are you sure you want to delete this Section?', false, '', true);
        const confirmDelete = async () => {
            handleCloseLoader();

            handleShowLoader('Deleted', '', true)
            try {
                await sectionService.deleteData(id);
                setSections((prevSections) => prevSections.filter((s) => s.ID_SECTION !== id));
                setLoaderState(prev => ({
                    ...prev,
                    loading: false,
                    successMessage: 'Your data has been successfully deleted.'
                }));
            } catch (err) {
                setLoaderState(prev => ({
                    ...prev,
                    title: "ERROR",
                    loading: false,
                    successMessage: err.response.data.message
                }));
            }
        }
        setLoaderState(prev => ({ ...prev, handleConfirm: confirmDelete }));
    };

    const [search, setSearch] = useState("");
    const [sort, setSort] = useState("");
    const [page, setCurrentPage] = useState(1);
    const [limit, setLimit] = useState(7);
    const [totalPages, setTotalPages] = useState(0);
    const [totalData, setTotalData] = useState(null);
    
    const fetchData = async () => {
        setLoading(true);
        try {
            const data = await sectionService.fetchData(search, sort, page, limit);
            setTotalPages(data.payload.totalPages);
            setTotalData(data.payload.totalItems);
            setSections(data.payload.sections);
        } catch (err) {
            setError(err);
        } finally {
            setLoading(false);
        }
    };

    const handleSerachChange = () => {
        fetchData();
        setCurrentPage(1);
    }

    const handlePageChange = (pages) => {
        setCurrentPage(pages);
    }

    const handleLimitsChange = (e) => {
        setLimit(e.target.value);
        setCurrentPage(1);
    }

    useEffect(() => {
        fetchData();
    }, []);


    return { 
        sections, 
        loading, 
        error, 
        selectedSection, 
        selectedImage, 
        formData, 

        createSection, 
        editSection, 
        deleteSection,
        setSelectedSection,
        setFormData,
        handleFormChange,
        handleImageChange,
        resetForm,

        show,
        setShow,
        handleShow,
        handleClose,
        showLoader,
        handleShowLoader,
        handleCloseLoader,
        loaderState,
        setLoaderState,
        thumbPath,

        totalPages,
        totalData,
        setSearch,
        page, 
        handlePageChange,
        handleLimitsChange,
        handleSerachChange
    };
};

export default useSections;
