import camelCase from './camelCase';

/**
 * DOM-based Routing
 *
 * Based on {@link http://goo.gl/EUTi53|Markup-based Unobtrusive Comprehensive DOM-ready Execution} by Paul Irish
 *
 * The routing fires all common scripts, followed by the page specific scripts.
 * Add additional events for more control over timing e.g. a finalize event
 */
class Router {
	/**
	 * Create a new Router
	 *
	 * @param {object} routes
	 */
	constructor( routes ) {
		this.routes = routes;
	}

	/**
	 * Fire Router events
	 *
	 * @param {string} route DOM-based route derived from body classes (`<body class="...">`)
	 * @param {string} [event] Events on the route. By default, `init` and `finalize` events are called.
	 * @param {string} [arg] Any custom argument to be passed to the event.
	 */
	fire( route, event = 'init', arg ) {
		const fire =
			route !== '' &&
			this.routes[route] &&
			typeof this.routes[route][event] === 'function';
		if ( fire ) {
			this.routes[route][event]( arg );
		}
	}

	/**
	 * Automatically load and fire Router events
	 *
	 * Events are fired in the following order:
	 *  common init
	 *  page-specific init
	 *  page-specific finalize
	 *  common finalize
	 */
	loadEvents() {
		// Fire common init JS
		this.fire( 'common' );

		// Fire page-specific init JS, and then finalize JS
		document.body.className
			.toLowerCase()
			.replace( /-/g, '_' )
			.split( /\s+/ )
			.map( camelCase )
			.forEach( className => {
				this.fire( className );
				this.fire( className, 'finalize' );
			} );

		// Fire common finalize JS
		this.fire( 'common', 'finalize' );
	}
}

export default Router;