/* eslint-disable no-console */
import { useCallback } from 'react';
import { ThunkAction } from 'redux-thunk';
import { StoreState } from '@Reducers/_InitializeStore/types';
import useDispatch from './useDispatch';

type useReduxAPICallBack = (action: string, props: Array<unknown>) => void;

type actionType =
  | 'user'
  | 'global'
  | 'message';

interface ReduxAction {
  [key: string]: (...props: Array<unknown>) => ThunkAction<Promise<void>, StoreState, unknown, { type: string }>;
}

interface ReduxActionModule {
  [key: string]: ReduxAction;
}

const VALID_ACTIONS: actionType[] = [
  'user',
  'global',
  'message',
];

const LOAD_MODULE: ReduxActionModule = {};

/**
 * 描述 : 取得指定的 Redux Action
 */

export default function useReduxAPI(actionType: actionType): useReduxAPICallBack {
  /* Global & Local State */
  const dispatch = useDispatch();
  /* Main */
  return useCallback(
    (action: string, props: Array<unknown>) => {
      const isInclude = VALID_ACTIONS.includes(actionType);
      let reduxType: ReduxAction = {};
      if (isInclude) {
        if (LOAD_MODULE[actionType]) {
          reduxType = LOAD_MODULE[actionType];
        } else {
          LOAD_MODULE[actionType] = require(`@Reducers/${actionType}/actions`);
          reduxType = LOAD_MODULE[actionType];
        }
        if (reduxType) {
          const reduxAction = reduxType[action];
          if (reduxAction) {
            dispatch(reduxAction(...props));
          } else {
            console.warn(`Can't find the action ::: ${action}`);
          }
        } else {
          console.warn(`Can't load module ::: ${reduxType}`);
        }
      } else {
        console.warn(`Can't find the action type ::: ${actionType}`);
      }
    },
    [actionType],
  );
}
