import { Action } from 'redux';
import { ThunkAction, ThunkDispatch } from 'redux-thunk';

import { IProviderExtraArguments } from 'common/models/IProviderExtraArguments';

import { IPokemonExplorerState } from './components/PokemonExplorer/types';
import { IPokemonSelectListState } from './components/PokemonSelectList/types';

import { PokemonService } from 'api/PokemonService';

export interface IPokemonAppStore {
    pokemonSelectListState : IPokemonSelectListState;
    pokemonExplorerState : IPokemonExplorerState;
}

export interface IPokemonAppServices {
    pokemonService : PokemonService;
}

export interface IPokemonAppExtraArguments extends IProviderExtraArguments {
    services : IPokemonAppServices;
}

export type ThunkResult<R> = ThunkAction<R, IPokemonAppStore, IPokemonAppExtraArguments, Action>;
export type ThunkDispatchPokemonSelectList = ThunkDispatch<IPokemonAppStore, IPokemonAppExtraArguments, Action>;
