import { useMutation, useQueryClient } from 'react-query';
import { getApiBaseUrl } from './getApiBaseUrl';
import { useClient } from './useClient';
import { invalidateQueriesByEntityName } from './invalidateQueriesByEntityName';
import { useErrorHandler } from './useErrorHandler';
import { AxiosRequestConfig } from 'axios';

export interface UseSaveItemOptions {
  entityName: string;
  t?: (english?: string) => string | undefined;
  requestConfig?: AxiosRequestConfig;
  errorMessage?: string;
}

export const useSaveItem = <T extends { id: string }>({
  entityName,
  t = (english?: string) => english,
  requestConfig = {},
  errorMessage,
}: UseSaveItemOptions) => {
  const { post } = useClient();
  const { errorHandler } = useErrorHandler({ message: errorMessage ?? 'Save failed.', t });
  const queryClient = useQueryClient();
  return useMutation((model: T) => post(`${getApiBaseUrl(entityName)}`, model, requestConfig), {
    onError: errorHandler,
    onSuccess: () => {
      setTimeout(() => invalidateQueriesByEntityName(queryClient)(entityName), 250);
    },
  });
};