import {
  ColumnPinningState,
  ExpandedState,
  PaginationState,
  RowSelectionState,
  SortingState,
} from "@tanstack/react-table";
import { useState } from "react";
import { CraftTableOptionsProps } from "../../types/table-options";
import {
  FilterDataMainFilterEntityListProps,
  FilterDataProps,
  FilterMasterStateProps,
  FilterOperationListProps,
  FilterStateProps,
} from "../../types/filter";

export function useCraftTable(paginationPageSize: number = 25) {
  const [pagination, setPagination] = useState<PaginationState>({
    pageIndex: 0,
    pageSize: paginationPageSize,
  });
  const [sorting, setSorting] = useState<SortingState>([]);
  const [rowSelection, setRowSelection] = useState<RowSelectionState>({});
  const [expanded, setExpanded] = useState<ExpandedState>({});
  const [wrapColumns, setWrapColumns] = useState<Record<string, boolean>>({
    all_wrap: true,
  });

  // Filters to be rendered in form
  const [filters, setFilters] = useState<FilterStateProps[]>([]);
  // Saved filter Component - savedFilterEditValue is set on list click
  const [savedFilterEditValue, setSavedFilterEditValue] = useState<
    string | number
  >("");
  const [filterToDelete, setFilterToDelete] =
    useState<FilterOperationListProps | null>(null);
  const [filterSelectedAttributeValue, setFilterSelectedAttributeValue] =
    useState<string>("");

  const [filterMaster, setFilterMaster] =
    useState<FilterMasterStateProps | null>(null);

  const [showTableFilter, setShowTableFilter] = useState<boolean>(false);

  //For filter criteria paper
  const [showFilterOptions, setShowFilterOption] = useState<boolean>(false);
  const [filterData, setFilterData] = useState<FilterDataProps | null>(null);
  const [selectedFilterEntity, setSelectedFilterEntity] =
    useState<FilterDataMainFilterEntityListProps>();

  if (pagination.pageIndex < 0 || pagination.pageSize <= 0) {
    throw new Error(
      "Invalid pagination values: pageIndex and pageSize must be positive."
    );
  }

  // For Default Column Pinning
  const [columnPinning, setColumnPinning] = useState<ColumnPinningState>({
    left: [],
    right: [],
  });

  const craftTableOptions: CraftTableOptionsProps = {
    sorting: sorting,
    setSorting: setSorting,
    pagination: pagination,
    setPagination: setPagination,
    rowSelection: rowSelection,
    setRowSelection: setRowSelection,
    expanded: expanded,
    setExpanded: setExpanded,
    wrapColumns: wrapColumns,
    setWrapColumns: setWrapColumns,
    filters: filters,
    setFilters: setFilters,
    savedFilterEditValue: savedFilterEditValue,
    setSavedFilterEditValue: setSavedFilterEditValue,
    filterToDelete: filterToDelete,
    setFilterToDelete: setFilterToDelete,
    filterSelectedAttributeValue: filterSelectedAttributeValue,
    setFilterSelectedAttributeValue: setFilterSelectedAttributeValue,
    filterMaster: filterMaster,
    setFilterMaster: setFilterMaster,
    showTableFilter: showTableFilter,
    setShowTableFilter: setShowTableFilter,
    showFilterOptions: showFilterOptions,
    setShowFilterOption: setShowFilterOption,
    columnPinning: columnPinning,
    setColumnPinning: setColumnPinning,
    filterData: filterData,
    setFilterData: setFilterData,
    selectedFilterEntity: selectedFilterEntity,
    setSelectedFilterEntity: setSelectedFilterEntity,
  };

  return craftTableOptions;
}
