import {
  AnyAtomInstance,
  AnyAtomTemplate,
  AtomExportsType,
  AtomParamsType,
  AtomStateType,
  ParamlessTemplate,
  StateHookTuple,
} from '../types/index'
import { injectAtomInstance } from './injectAtomInstance'

export const injectAtomState: {
  <A extends AnyAtomTemplate>(
    template: A,
    params: AtomParamsType<A>
  ): StateHookTuple<AtomStateType<A>, AtomExportsType<A>>

  <A extends AnyAtomTemplate<{ Params: [] }>>(template: A): StateHookTuple<
    AtomStateType<A>,
    AtomExportsType<A>
  >

  <A extends AnyAtomTemplate>(template: ParamlessTemplate<A>): StateHookTuple<
    AtomStateType<A>,
    AtomExportsType<A>
  >

  <I extends AnyAtomInstance>(instance: I): StateHookTuple<
    AtomStateType<I>,
    AtomExportsType<I>
  >
} = <A extends AnyAtomTemplate>(
  atom: A,
  params?: AtomParamsType<A>
): StateHookTuple<AtomStateType<A>, AtomExportsType<A>> => {
  const instance = injectAtomInstance(atom, params as AtomParamsType<A>, {
    operation: 'injectAtomState',
    subscribe: true,
  })

  return [instance.getState(), instance._infusedSetter]
}
