import { Context, createContext, ReactNode, useContext } from 'react';
import { StoreApi, useStore } from 'zustand';

const TableSettingsContext = createContext<StoreApi<object> | null>(null);
TableSettingsContext.displayName = 'TableSettingsContext';

export function useTableSettings<T extends object>() {
  const Context = getContextType<T>();

  const context = useContext(Context);
  if (context === null) {
    throw new Error('must be nested under TableSettingsProvider');
  }

  return useStore(context);
}

interface ProviderProps<T extends object> {
  children: ReactNode;
  settings: StoreApi<T>;
}

export function TableSettingsProvider<T extends object>({
  children,
  settings,
}: ProviderProps<T>) {
  const Context = getContextType<T>();

  return <Context.Provider value={settings}>{children}</Context.Provider>;
}

function getContextType<T extends object>() {
  return TableSettingsContext as unknown as Context<StoreApi<T>>;
}