/// <reference path="../../../../../typings-module/process.d.ts" />
"use strict";
const process = require('process');
const getRest = (action) => {
    let rest = {};
    let restKeys = Object.keys(action).filter((key) => {
        return key !== 'promise' && key !== 'type';
    });
    restKeys.forEach((key) => {
        rest[key] = action[key];
    });
    return rest;
};
const extendRest = (rest, extend) => {
    let all = rest;
    Object.keys(extend).forEach((extendkey) => {
        all[extendkey] = extend[extendkey];
    });
    return all;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = (store) => (next) => (action) => {
    const { promise, type } = action;
    const rest = getRest(action);
    // 没有 promise 字段不处理
    if (!promise)
        return next(action);
    const REQUEST = type + '_REQUEST';
    const SUCCESS = type + '_SUCCESS';
    const FAILURE = type + '_FAILURE';
    if (process.browser) {
        next(extendRest(rest, {
            type: REQUEST
        }));
        return promise.then((req) => {
            next(extendRest(rest, {
                data: req.data, type: SUCCESS
            }));
            return true;
        }).catch((error) => {
            next(extendRest(rest, {
                error: error, type: FAILURE
            }));
            console.log('FrontEnd PromiseMiddleware Error:', error);
            return false;
        });
    }
    else {
        const result = promise(action.data, action.req);
        if (typeof result.then === 'function') {
            return result.then((data) => {
                next(extendRest(rest, {
                    data: data, type: SUCCESS
                }));
                return true;
            }).catch((error) => {
                next(extendRest(rest, {
                    error: error, type: FAILURE
                }));
                console.log('ServerEnd PromiseMiddleware Error:', error);
                return false;
            });
        }
        else {
            return next(extendRest(rest, {
                type: SUCCESS,
                data: result
            }));
        }
    }
};
