'use client'
import { useMutation } from '@tanstack/react-query'
import type {
  Config,
  ResolvedRegister,
  SendTransactionSyncErrorType,
} from '@wagmi/core'
import type { Compute, ConfigParameter } from '@wagmi/core/internal'
import {
  type SendTransactionSyncData,
  type SendTransactionSyncMutate,
  type SendTransactionSyncMutateAsync,
  type SendTransactionSyncOptions,
  type SendTransactionSyncVariables,
  sendTransactionSyncMutationOptions,
} from '@wagmi/core/query'
import type { UseMutationReturnType } from '../utils/query.js'
import { useConfig } from './useConfig.js'

export type UseSendTransactionSyncParameters<
  config extends Config = Config,
  context = unknown,
> = Compute<
  ConfigParameter<config> & SendTransactionSyncOptions<config, context>
>

export type UseSendTransactionSyncReturnType<
  config extends Config = Config,
  context = unknown,
> = Compute<
  UseMutationReturnType<
    SendTransactionSyncData,
    SendTransactionSyncErrorType,
    SendTransactionSyncVariables<config, config['chains'][number]['id']>,
    context,
    SendTransactionSyncMutate<config, context>,
    SendTransactionSyncMutateAsync<config, context>
  > & {
    /** @deprecated use `mutate` instead */
    sendTransactionSync: SendTransactionSyncMutate<config, context>
    /** @deprecated use `mutateAsync` instead */
    sendTransactionSyncAsync: SendTransactionSyncMutateAsync<config, context>
  }
>

/** https://wagmi.sh/react/api/hooks/useSendTransactionSync */
export function useSendTransactionSync<
  config extends Config = ResolvedRegister['config'],
  context = unknown,
>(
  parameters: UseSendTransactionSyncParameters<config, context> = {},
): UseSendTransactionSyncReturnType<config, context> {
  const config = useConfig(parameters)
  const options = sendTransactionSyncMutationOptions(config, parameters)
  const mutation = useMutation(options)
  type Return = UseSendTransactionSyncReturnType<config, context>
  return {
    ...(mutation as Return),
    sendTransactionSync: mutation.mutate as Return['mutate'],
    sendTransactionSyncAsync: mutation.mutateAsync as Return['mutateAsync'],
  }
}
