"use strict";
const React = require('react');
const server_1 = require('react-dom/server');
const react_router_1 = require('react-router');
const react_redux_1 = require('react-redux');
const server_request_1 = require('../server-request');
const fetch_1 = require('../fetch');
const store_1 = require('../store');
const service_1 = require('../service');
// 渲染整个页面
const renderFullPage = (htmlText, element, initialState, initialTitle) => {
    let content = htmlText;
    // 将内容塞到 #react-dom
    content = content.replace(/<div id=\"react-dom\"><\/div>/g, `<div id="react-dom">${element}</div>`);
    // 设置 Redux 初始状态
    content = content.replace(/__serverData\((\'|\")__INITIAL_STATE__(\'|\")\)/g, JSON.stringify(initialState));
    // 设置 title
    content = content.replace(/__serverData\((\'|\")__INITIAL_TITLE__(\'|\")\)/g, initialTitle);
    return content;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = (option) => {
    // 如果不启动后端渲染,直接返回未加工的模板
    if (!option.enableServerRender) {
        return option.res.status(200).send(renderFullPage(option.htmlText, '', {}, ''));
    }
    react_router_1.match({
        routes: option.routes,
        location: option.req.url,
        basename: option.basename
    }, (error, redirectLocation, renderProps) => {
        if (error) {
            option.res.status(500).send(error.message);
        }
        else if (redirectLocation) {
            option.res.redirect(302, redirectLocation.pathname + redirectLocation.search);
        }
        else if (renderProps) {
            const serverRequestHelper = new server_request_1.default(service_1.default, option.req);
            // 初始化 fetch
            fetch_1.setServerRender(serverRequestHelper.Request);
            // 初始化 redux
            const store = store_1.default({}, option.rootReducer);
            const InitialView = React.createElement(react_redux_1.Provider, { store: store }, React.createElement(react_router_1.RouterContext, renderProps));
            // 找到最深层组件的 title
            const title = renderProps.components[renderProps.components.length - 1].title;
            try {
                // 初次渲染触发所有需要的网络请求
                server_1.renderToString(InitialView);
                // 拿到这些请求的action
                const actions = serverRequestHelper.getActions();
                Promise.all(actions.map((action) => {
                    return store.dispatch(action);
                })).then(() => {
                    const componentHTML = server_1.renderToString(InitialView);
                    const initialState = store.getState();
                    // 将初始状态输出到 html
                    option.res.status(200).send(renderFullPage(option.htmlText, componentHTML, initialState, title));
                });
            }
            catch (err) {
                option.res.status(200).send(renderFullPage(option.htmlText, `Server Render Error: ${err.toString()}`, {}, title));
            }
        }
        else {
            option.res.status(404).send('Not Found');
        }
    });
};
