// @flow

import type { Dispatch } from './Dispatch';
import DispatchUtils from './DispatchUtils';
import type { DispatchAction } from './DispatchUtils';
import AbstractAction from './AbstractAction';

export default class NamespacedControllerFactory<StateNamespaceType: string> {
  dispatchAction: DispatchAction;

  stateNamespace: StateNamespaceType;

  constructor(dispatch: Dispatch, stateNamespace: StateNamespaceType) {
    this.dispatchAction = DispatchUtils.createActionDispatcher(dispatch);
    this.stateNamespace = stateNamespace;
  }

  dispatchActionWithDi(
    diContainer: { create: (...args: Array<any>) => any },
    actionClass: Class<AbstractAction<any, any>>,
    otherArgs: Object
  ) {
    diContainer
      .create(actionClass, {
        stateNamespace: this.stateNamespace,
        dispatchAction: this.dispatchAction,
        ...otherArgs
      })
      .then((action: any) => this.dispatchAction(action));
  }
}