import { PropsWithChildren, createContext, useContext, useMemo } from 'react';

/** Value of {@link TableCellContext} */
export interface TableCellContextValue {
  /** Current render row number (including header row) */
  rowNumber: number;
  /** Current render column number (including selection column) */
  columnNumber: number;
  /** Link that should be opened when cell is clicked */
  linkTo?: string;
  /** Function that should be called when cell is clicked */
  onClick?: () => void;
}

const TableCellContext = createContext<TableCellContextValue | undefined>(undefined);

/** Provider for cell dependent data */
export function TableCellContextProvider({
  rowNumber,
  columnNumber,
  linkTo,
  onClick,
  children,
}: PropsWithChildren<TableCellContextValue>) {
  const value: TableCellContextValue = useMemo(
    () => ({ rowNumber, columnNumber, linkTo, onClick }),
    [columnNumber, linkTo, onClick, rowNumber],
  );

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

/** Return data for current cell */
export function useTableCellContext(): TableCellContextValue {
  const value = useContext(TableCellContext);
  if (!value) {
    throw new Error('useTableCellContext should be used only inside TableCellContextProvider');
  }

  return value;
}
