'use client'
import {createContext, useCallback, useEffect, useState} from "react";
import {flattenArrayOfObjects} from "@/core/utils/flattenArrayOfObjects";

export const TableSettingContext = createContext();
export const TableSettingProvider = ({children}) => {
    const [settingStore, setSettingStore] = useState({});

    useEffect(() => {
        const _localStorage = localStorage.getItem("_setting-app")
        if (_localStorage) {
            setSettingStore(JSON.parse(_localStorage))
        }
    }, []);

    const hideAction = useCallback((user_id, page_name, table_name, settingValue, columns) => {
        updateSettingStorage(user_id, page_name, table_name, "hides", settingValue, columns);
    }, [])
    const sortAction = useCallback((user_id, page_name, table_name, settingValue, columns) => {
        updateSettingStorage(user_id, page_name, table_name, "sorts", settingValue, columns);
    }, [])
    const filterAction = (user_id, page_name, table_name, settingValue, columns) => {
        updateSettingStorage(user_id, page_name, table_name, "filters", settingValue, columns);
    }
    const updateSettingStorage = (user_id, page_name, table_name, settingType, settingValue, columns) => {
        const prevLocalStorage = JSON.parse(localStorage.getItem("_setting-app")) || {};
        const userSettings = prevLocalStorage[user_id] || {};
        const pageSettings = userSettings[page_name] || {};
        const tableSettings = pageSettings[table_name] || {};
        let newSettings;
        if (settingType === "sorts" || settingType === "filters") {
            newSettings = [...settingValue];
        } else {
            newSettings = {...tableSettings[settingType] || {}, ...settingValue};
        }
        const updatedLocalStorage = {
            ...prevLocalStorage,
            [user_id]: {
                ...userSettings,
                [page_name]: {
                    ...pageSettings,
                    [table_name]: {
                        ...tableSettings,
                        [settingType]: Array.isArray(settingValue) ? [...newSettings] : {...newSettings},
                        summary: SummaryTextMessage({
                            ...tableSettings,
                            [settingType]: Array.isArray(settingValue) ? [...newSettings] : {...newSettings},
                        }, columns)
                    },
                },
            },
        };
        localStorage.setItem("_setting-app", JSON.stringify(updatedLocalStorage));
        setSettingStore(updatedLocalStorage);
    }

    const SummaryTextMessage = (values, columns) => {
        let SummaryText = "";
        let HideText = "";
        let FilterText = "";
        let SortText = "";

        if (values.sorts && values.sorts.length > 0) {
            const _list = []
            for (const sort of values.sorts) {
                const _column = columns.find(column => column.id == sort.id)
                if (_column)
                    _list.push(`${_column.header}` + `(${sort.desc ? "نزولی" : "صعودی"})`)
            }
            if (_list.length > 0)
                SortText = " مرتب شده بر اساس : " + _list.join(", ")
        }
        if (values.filters && values.filters.length > 0) {
            const _list = []
            for (const filter of values.filters) {
                const _column = columns.find(column => column.id == filter.id)
                if (_column)
                    _list.push(`${_column.header}`)
            }
            if (_list.length > 0)
                FilterText = " فیلتر شده بر اساس : " + _list.join(", ")
        }

        if (values.hides) {
            const hidesArray = Object.entries(values.hides).map((e) => ({id: e[0], value: e[1]}))
            if (hidesArray.length > 0) {
                const _list = []
                for (const hide of hidesArray) {
                    if (hide.value) continue
                    const _column = columns.find(c => c.id == hide.id)
                    if (_column)
                        _list.push(_column.header)
                }
                if (_list.length > 0)
                    HideText = "ستون های مخفی شده : " + _list.join(", ");
            }
        }

        if (HideText || SortText || FilterText) {
            if (SortText) {
                SummaryText += SortText;
                if (HideText) {
                    SummaryText += " ; ";
                }
                if (FilterText) {
                    SummaryText += " ; ";
                }
            }
            if (HideText) {
                SummaryText += HideText;
                if (FilterText) {
                    SummaryText += " ; ";
                }
            }
            if (FilterText) {
                SummaryText += FilterText
            }
        }

        return SummaryText;
    };

    return (
        <TableSettingContext.Provider
            value={{settingStore, hideAction, sortAction, filterAction}}>
            {children}
        </TableSettingContext.Provider>
    );
};