/*
 * 
 *   Copyright 2016 RIFT.IO Inc
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 *
 */
import React from 'react';
import {
    Router, Route, hashHistory, IndexRoute
}
from 'react-router';
import SkyquakeContainer from 'widgets/skyquake_container/skyquakeContainer.jsx';

/**
 * This is the Skyquake App wrapper that all plugins use to be a Skyquake plugin. This 
 * is not a react component although it does return a react component that will be the
 * app.
 * This function will also set the title into the <head>
 * 
 * @export
 * @param {any} config 
 * @param {any} context 
 * @returns a react component to be rendered manually.
 */
export default function(config, context) {
    let routes = [];
    let index = null;
    let components = null;
    
    document.title = config.name || "OpenMANO";

    if (config && config.routes) {
        routes =  buildRoutes(config.routes)
        function buildRoutes(routes) {
            return routes.map(function(route, index) {
                let routeConfig = {};
                if (route.route && route.component) {
                    // ES6 modules need to specify default
                    let path = route.route;
                    if(route.path && route.path.replace(' ', '') != '') {
                        path = route.path
                    }
                    routeConfig = {
                        path: path,
                        name: route.label,
                        getComponent: function(location, cb) {
                            require.ensure([], (require) => {
                                cb(null, context(route.component).default)
                            })
                        }
                    }
                    if(route.routes && (route.routes.length > 0)){
                        routeConfig.childRoutes = buildRoutes(route.routes)
                    }
                } else {
                    console.error('Route not properly configured. Check that both path and component are specified');
                }
                return routeConfig;
            });
        }
        routes.push({
            path: '/login',
            name: 'Login',
            component:  require('../login/login.jsx').default
        });
        routes.push({
            path:'*',
            name: 'Dashboard',
            getComponent: function(loc, cb) {
                cb(null, context(config.dashboard).default);
            }
        });
        if (config.dashboard) {
            // ES6 modules need to specify default
            index = <IndexRoute component={context(config.dashboard).default} />;
        } else {
            index = DefaultDashboard
        }

        const rootRoute = {
            component: SkyquakeContainer,
            path: '/',
            name: 'Dashboard',
            indexRoute: {
                component: (config.dashboard) ? context(config.dashboard).default : DefaultDashboard
            },
            childRoutes: routes
        }
        return((
            <Router history={hashHistory} routes={rootRoute}>
            </Router>
        ))
    } else {
        console.error('There are no routes configured in the config.json file');
    }
}

//When no default dashboard is specified in the plugin_config.json, use this component.
class DefaultDashboard extends React.Component {
    constructor(props) {
        super(props)
    }
    render() {
        let html;
        html = <div> This is a default dashboard page component </div>;
        return html;
    }
}
