const defaultFilters: TableFilters = {
  search: {
    fields: [],
    text: "",
  },
  pagination: { pageSize: 10, pageIndex: 0 },
  sort: { field: "", direction: "asc" },
  visibility: { hiddenColumns: [] },
};

export const filtersManager = {
  pagination: {
    max: (
      count: number,
      filters: TableFilters,
      setFilters: React.Dispatch<any>,
    ) => {
      const maxPage = Math.ceil(count / filters.pagination.pageSize);
      const currentPage = filters.pagination.pageIndex + 1;

      if (currentPage > maxPage) {
        filtersManager.pagination.min(filters);
        setFilters((prev) => {
          return {
            ...prev,
            pagination: {
              ...prev.pagination,
              pageIndex: Math.max(0, maxPage - 1),
            },
          };
        });
      }
    },
    min(filters: TableFilters): TableFilters {
      return {
        ...filters,
        pagination: {
          ...filters.pagination,
          pageIndex: Math.max(0, filters.pagination.pageIndex),
        },
      };
    },
  },

  storage: {
    save: (id: string, filters: TableFilters) => {
      const filterToSave = {
        pagination: filters.pagination,
        sort: filters.sort,
        visibility: filters.visibility,
      };

      localStorage.setItem(`table-filters-${id}`, JSON.stringify(filterToSave));
    },

    load: (id: string, searchFields: string[], initialSort?: SortFilter) => {
      const filters = { ...defaultFilters };
      const stored = localStorage.getItem(`table-filters-${id}`);
      if (stored) {
        const storedFilters = JSON.parse(stored);
        Object.keys(storedFilters).forEach((key) => {
          if (key in filters) {
            filters[key] = storedFilters[key];
          }
        });
      }
      filters.search.fields = searchFields;
      return filters;
    },
  },
};
