import {Action, MiddlewareAPI} from "redux";
import {IReduxActionConstructor, ReduxAction} from "../action";
import {IPlugin, ReduxStore} from "../store";
import {VirtualStore} from "../virtual-store";

export interface IPromiseState {
	result: any;
	success: boolean;
	resolved: boolean;
}

export interface IPromiseState {
	PromiseQueue: IPromiseState[];
}

export class PromiseQueue extends VirtualStore<IPromiseState> {
}

export interface IPromiseActionData<IData> {
	promise: Promise<IData>;
	success: IReduxActionConstructor<IData, any>;
	failed: IReduxActionConstructor<any, any>;
}

export class PromiseAction extends ReduxAction<IPromiseActionData<any>, IPromiseState> {
}

export function promiseMiddleware(store: MiddlewareAPI<any>) {
	return (next) => {
		return (action: Action) => {
			if (!PromiseAction.is(action)) {
				return next(action);
			}
			const {promise, success, failed} = (action as PromiseAction).payload;
			promise.then((data) => {
				store.dispatch(new success(data).toJSON());
			}, (e) => {
				store.dispatch(new failed(e).toJSON());
			});
		};
	};
}

export class PromisePlugin implements IPlugin<IPromiseState> {
	__redux_plugin(redux: ReduxStore<IPromiseState>): void {
		redux.use(promiseMiddleware);
		redux.register(PromiseQueue)
	}
}

