/* eslint no-unused-expressions:0 */

/**
 * 定义应用路由
 */
import React from 'react';
import { Router, hashHistory, browserHistory } from 'react-router';
import setSpm from '@alife/set-spm';
import Events from '@ali/ice-events';
import { join } from 'path';
import { isAlibaba } from './utils';

const getSpm = (currentState) => {
  const { location, routes } = currentState;
  const currentPath = location.pathname.split('/')[1];

  let spm;
  routes.forEach((item) => {
    if (item.path === currentPath) {
      spm = item.spm;
    }
  });

  return spm;
};

const onRouteEnter = (nextState, replace, callback) => {
  callback && callback();
  setSpm(getSpm(nextState));
};

const onRouteChange = (prevState, nextState, replace, callback) => {
  callback && callback();
  setSpm(getSpm(nextState));
};
const routePrefix = isAlibaba ? '/' : '/ice';
window.routePrefix = routePrefix;
const appRoutes = {
  path: routePrefix,
  onEnter: onRouteEnter,
  onChange: onRouteChange,
  childRoutes: [
    {
      getComponent(location, returnComponent) {
        require.ensure(
          [],
          (require) => {
            returnComponent(null, require('./layouts/LandingLayout'));
          },
          'landing-layout'
        );
      },
      indexRoute: {
        getComponent(location, callback) {
          require.ensure(
            [],
            (require) => {
              callback(null, require('./pages/Landing'));
            },
            'landing'
          );
        },
      },
    },
    {
      path: 'docs',
      spm: 'a211sg.docs',
      getComponent(location, returnComponent) {
        require.ensure(
          [],
          (require) => {
            returnComponent(null, require('./layouts/ScalableLayout'));
          },
          'scalable-layout'
        );
      },
      indexRoute: {
        onEnter: (_, replaceState) =>
          replaceState(join(routePrefix, 'docs/about')),
      },
      childRoutes: [
        {
          path: ':category/:path',
          onEnter() {
            setTimeout(() => {
              Events.emit('fix-header-nav-active');
            }, 100);
          },
          getComponent(location, returnComponent) {
            require.ensure(
              [],
              (require) => {
                returnComponent(null, require('./pages/Documentation'));
              },
              'documentation'
            );
          },
        },
        {
          path: ':path',
          getComponent(location, returnComponent) {
            require.ensure(
              [],
              (require) => {
                returnComponent(null, require('./pages/Documentation'));
              },
              'documentation'
            );
          },
        },
      ],
    },
    {
      path: 'component',
      spm: 'a211sg.component',
      getComponent(location, returnComponent) {
        require.ensure(
          [],
          (require) => {
            returnComponent(null, require('./layouts/ScalableLayout'));
          },
          'scalable-layout'
        );
      },
      indexRoute: {
        getComponent(location, callback) {
          require.ensure(
            [],
            (require) => {
              callback(null, require('./pages/Component'));
            },
            'component'
          );
        },
      },
      childRoutes: [
        {
          path: ':componentName',
          getComponent(location, returnComponent) {
            require.ensure(
              [],
              (require) => {
                returnComponent(null, require('./pages/Component'));
              },
              'component'
            );
          },
        },
      ],
    },
    {
      path: 'playground',
      spm: 'a211sg.playground',
      getComponent(location, returnComponent) {
        require.ensure(
          [],
          (require) => {
            returnComponent(null, require('./layouts/ScalableLayout'));
          },
          'scalable-layout'
        );
      },
      childRoutes: [
        {
          path: 'list',
          getComponent(location, returnComponent) {
            require.ensure(
              [],
              (require) => {
                returnComponent(null, require('./pages/PlaygroundList'));
              },
              'playground-list'
            );
          },
        },
        {
          path: ':playgroundId',
          getComponent(location, callback) {
            require.ensure(
              [],
              (require) => {
                callback(null, require('./pages/Playground'));
              },
              'playground'
            );
          },
        },
      ],
      indexRoute: {
        getComponent(location, callback) {
          if (isAlibaba) {
            require.ensure(
              [],
              (require) => {
                callback(null, require('./pages/PlaygroundList'));
              },
              'playground-list'
            );
          } else {
            require.ensure(
              [],
              (require) => {
                callback(null, require('./pages/Playground'));
              },
              'playground'
            );
          }
        },
      },
    },
    {
      path: 'collection',
      getComponent(location, returnComponent) {
        require.ensure(
          [],
          (require) => {
            returnComponent(null, require('./layouts/ScalableLayout'));
          },
          'scalable-layout'
        );
      },
      indexRoute: {
        getComponents(location, returnComponents) {
          require.ensure(
            [],
            (require) => {
              returnComponents(null, {
                aside: require('./pages/Collect/Sidebar'),
                children: require('./pages/Collect/CollectData'),
              });
            },
            'collect-data'
          );
        },
      },
      childRoutes: [
        {
          path: 'projects',
          getComponents(location, returnComponents) {
            require.ensure(
              [],
              (require) => {
                returnComponents(null, {
                  aside: require('./pages/Collect/Sidebar'),
                  children: require('./pages/Collect/CollectList'),
                });
              },
              'collect'
            );
          },
        },
        {
          path: 'mine',
          getComponents(location, returnComponents) {
            require.ensure(
              [],
              (require) => {
                returnComponents(null, {
                  aside: require('./pages/Collect/Sidebar'),
                  children: require('./pages/Collect/CollectList'),
                });
              },
              'collect'
            );
          },
        },
        {
          path: ':id',
          getComponents(location, returnComponents) {
            require.ensure(
              [],
              (require) => {
                returnComponents(null, {
                  aside: require('./pages/Collect/Sidebar'),
                  children: require('./pages/Collect/CollectDetail'),
                });
              },
              'collect-detail'
            );
          },
        },
      ],
    },

    {
      path: routePrefix,
      getComponent(location, returnComponent) {
        require.ensure(
          [],
          (require) => {
            returnComponent(null, require('./layouts/BlankLayout/'));
          },
          'blank-layout'
        );
      },
      childRoutes: [
        {
          path: 'iceworks',
          spm: 'a211sg.iceworks',
          getComponent(location, returnComponent) {
            require.ensure(
              [],
              (require) => {
                returnComponent(null, require('./pages/ICEWorks'));
              },
              'iceworks-page'
            );
          },
        },
      ],
    },

    {
      path: routePrefix,
      getComponent(location, returnComponent) {
        require.ensure(
          [],
          (require) => {
            returnComponent(null, require('./layouts/ScalableLayout/'));
          },
          'scalable-layout'
        );
      },
      childRoutes: [
        {
          path: routePrefix,
          getComponent(location, returnComponent) {
            require.ensure(
              [],
              (require) => {
                returnComponent(null, require('./pages/Materials'));
              },
              'materials-page'
            );
          },
          childRoutes: [
            {
              path: 'component/:componentName',
              getComponent(location, returnComponent) {
                require.ensure(
                  [],
                  (require) => {
                    returnComponent(null, require('./pages/Component'));
                  },
                  'component-list-page'
                );
              },
            },
            {
              path: 'block',
              spm: 'a211sg.block',
              getComponent(location, returnComponent) {
                require.ensure(
                  [],
                  (require) => {
                    returnComponent(null, require('./pages/BlockList'));
                  },
                  'block-list-page'
                );
              },
            },
            {
              path: 'layout',
              spm: 'a211sg.layout',
              getComponent(location, returnComponent) {
                require.ensure(
                  [],
                  (require) => {
                    returnComponent(null, require('./pages/LayoutList'));
                  },
                  'layout-list-page'
                );
              },
            },
            {
              path: 'scaffold',
              spm: 'a211sg.scaffold',
              getComponent(location, returnComponent) {
                require.ensure(
                  [],
                  (require) => {
                    returnComponent(null, require('./pages/ScaffoldList'));
                  },
                  'scaffold-list-page'
                );
              },
            },
          ],
        },
        {
          path: 'block/:blockName',
          getComponent(location, returnComponent) {
            require.ensure(
              [],
              (require) => {
                returnComponent(null, require('./pages/BlockDetail'));
              },
              'block-detail-page'
            );
          },
        },
        {
          path: 'layout/:blockName',
          getComponent(location, returnComponent) {
            require.ensure(
              [],
              (require) => {
                returnComponent(null, require('./pages/BlockDetail'));
              },
              'block-detail-page'
            );
          },
        },
        {
          path: 'layout/:blockName/preview',
          getComponent(location, returnComponent) {
            require.ensure(
              [],
              (require) => {
                returnComponent(null, require('./pages/BlockPreview'));
              },
              'block-preview-page'
            );
          },
        },
        {
          path: 'block/:blockName/preview',
          getComponent(location, returnComponent) {
            require.ensure(
              [],
              (require) => {
                returnComponent(null, require('./pages/BlockPreview'));
              },
              'block-preview-page'
            );
          },
        },
        {
          path: 'learn*',
          getComponent(location, returnComponent) {
            require.ensure(
              [],
              (require) => {
                returnComponent(null, require('./pages/Study'));
              },
              'study-page'
            );
          },
        },
        {
          path: '*',
          getComponent(location, returnComponent) {
            require.ensure(
              [],
              (require) => {
                returnComponent(null, require('./pages/NotFound'));
              },
              'notfound-page'
            );
          },
        },
      ],
    },
  ],
};
export default <Router history={browserHistory} routes={appRoutes} />;
