import { FilterState } from '../share/aufgaben-shared/slices/filterSlice';

function treeStateFromLocalStoreage() {
  const treeState = JSON.parse(localStorage.getItem('tasko_tree'));
  if (treeState !== null) return treeState;

  const newTree = {
    state: { expanded: [], selected: null },
    width: 250, // default tree width
  };
  return newTree;
}

export function saveExpanded(expanded: string[]) {
  const treeState = treeStateFromLocalStoreage();
  const nextState = { ...treeState, state: { ...treeState.state, expanded } };
  localStorage.setItem('tasko_tree', JSON.stringify(nextState));
}

export function saveSelected(selected: string) {
  const treeState = treeStateFromLocalStoreage();
  const nextState = { ...treeState, state: { ...treeState.state, selected } };
  localStorage.setItem('tasko_tree', JSON.stringify(nextState));
}

export function saveWidth(width: number) {
  const treeState = treeStateFromLocalStoreage();
  const nextState = { ...treeState, width, state: { ...treeState.state } };
  localStorage.setItem('tasko_tree', JSON.stringify(nextState));
}

export function treeWidth(): number {
  const treeState = treeStateFromLocalStoreage();
  return treeState?.width ?? 250;
}

export function getSelected() {
  const treeState = treeStateFromLocalStoreage();

  return treeState?.state?.selected ?? null;
}

export function getExpanded(): string[] {
  const treeState = JSON.parse(localStorage.getItem('tasko_tree'));
  const expanded = treeState?.state?.expanded ?? [];

  return expanded;
}

export function saveFilterState(state: FilterState) {
  const newState = { ...state };
  delete newState['searchString'];
  delete newState['isShowTypeFilter'];
  localStorage.setItem('tasko_filter', JSON.stringify(newState));
}

export function getFilterState(): FilterState | null {
  const filter = JSON.parse(localStorage.getItem('tasko_filter'));
  return filter;
}

interface TableState {
  rowsPerPage: number;
}
function tableState(): TableState | null {
  return JSON.parse(localStorage.getItem('tasko_table'));
}
export function saveRowsPerPage(n: number) {
  let s = tableState();
  if (s === null) {
    s = { rowsPerPage: 10 };
  }

  localStorage.setItem('tasko_table', JSON.stringify({ ...s, rowsPerPage: n }));
}
export function rowsPerPage() {
  const s = tableState();
  return s?.rowsPerPage ?? 10;
}
