const currentPageHTMLParser = require( './currentPageHTMLParser' );
const time = require( './time' );
const LanguageInfo = require( './LanguageInfo' );
const currentPage = require( './currentPage' );
const Drawer = require( './Drawer' );
const CtaDrawer = require( './CtaDrawer' );
const lazyImageLoader = require( './lazyImages/lazyImageLoader' );
const icons = require( './icons' );
const PageHTMLParser = require( './PageHTMLParser' );
const showOnPageReload = require( './showOnPageReload' );
const OverlayManager = require( './OverlayManager' );
const View = require( './View' );
const Overlay = require( './Overlay' );
const references = require( './references/references' );
const search = {
	SearchOverlay: require( './search/SearchOverlay' ),
	SearchGateway: require( './search/SearchGateway' )
};
const promisedView = require( './promisedView' );
const headers = require( './headers' );
const Skin = require( './Skin' );
const mediaViewer = {
	overlay: require( './mediaViewer/overlay' )
};
const languageInfoOverlay = require( './languageOverlay/languageInfoOverlay' );
const languageOverlay = require( './languageOverlay/languageOverlay' );
const amcOutreach = require( './amcOutreach/amcOutreach' );
const util = require( './util.js' );
const actionParams = require( './actionParams.js' );
const Icon = require( './Icon.js' );
const IconButton = require( './IconButton.js' );
const MessageBox = require( './MessageBox.js' );
const Section = require( './Section.js' );
const Button = require( './Button.js' );

// Expose chunk to temporary variable which will be deleted and exported via ResourceLoader
// package inside mobile.startup.exports.

/**
 * The main library for accessing MobileFrontend's stable APIs.
 *
 * @module mobile.startup
 */
module.exports = {
	/**
	 * Internal, strictly for use inside MobileFrontend only
	 *
	 * @private
	 */
	Section,
	/**
	 * Internal, strictly for use inside MobileFrontend only
	 *
	 * @private
	 */
	MessageBox,
	/**
	 * Internal, strictly for use inside MobileFrontend only
	 *
	 * @private
	 */
	Icon,
	/**
	 * Internal, strictly for use inside MobileFrontend only
	 *
	 * @private
	 */
	IconButton,
	/**
	 * Internal, strictly for use inside MobileFrontend only
	 *
	 * @private
	 */
	Button,
	/**
	 * Internal, strictly for use inside MobileFrontend only
	 *
	 * @private
	 */
	actionParams,
	/**
	 * Internal, strictly for use inside MobileFrontend only
	 *
	 * @memberof module:mobile.startup
	 * @type module:mobile.startup/util
	 * @private
	 */
	util,
	/**
	 * Internal for use inside Minerva only
	 *
	 * @memberof module:mobile.startup
	 * @type module:mobile.startup/AmcOutreach
	 */

	amcOutreach,
	/**
	 * @private for use inside MobileFrontend only.
	 */
	headers,
	// Internal for use inside GrowthExperiments only.
	overlayHeader: headers.header,
	/**
	 * Internal for use inside Minerva, GrowthExperiments only.
	 *
	 * @type module:mobile.startup/Drawer
	 */
	Drawer,
	// Internal for use inside Minerva only.
	CtaDrawer,
	/**
	 * Internal for use inside Minerva, ExternalGuidance and Echo only.
	 *
	 * @memberof module:mobile.startup
	 * @type module:mobile.startup/View
	 */
	View: View.ClassES5,
	/**
	 * Internal for use inside Minerva, ExternalGuidance,
	 *  GrowthExperiments and Echo only.
	 *
	 * @memberof module:mobile.startup
	 * @type module:mobile.startup/Overlay
	 */
	Overlay: Overlay.ClassES5,
	/**
	 * Internal for use inside Minerva only.
	 *
	 * @memberof module:mobile.startup
	 * @type module:mobile.startup/PageHTMLParser
	 */
	currentPageHTMLParser,
	/**
	 * Internal for use inside Minerva, ExternalGuidance and Echo only.
	 *
	 * @memberof module:mobile.startup
	 * @return {module:mobile.startup/OverlayManager}
	 */
	getOverlayManager: () => OverlayManager.getSingleton(),
	/**
	 * Internal for use inside Minerva only.
	 *
	 * @type module:mobile.startup/Page
	 * @memberof module:mobile.startup
	 */
	currentPage,
	/**
	 * Internal for use inside Minerva only.
	 *
	 * @type module:mobile.startup/PageHTMLParser
	 * @memberof module:mobile.startup
	 */
	PageHTMLParser,
	/**
	 * Internal for use inside Minerva only.
	 *
	 * @type module:mobile.startup/Icon
	 * @memberof module:mobile.startup
	 */
	spinner: icons.spinner,
	/**
	 * Internal for use inside MobileFrontend only
	 *
	 * @private
	 */
	cancelIcon: icons.cancel,
	/**
	 * Internal for use inside Minerva only.
	 *
	 * @memberof module:mobile.startup
	 * @type module:mobile.startup/mediaViewer
	 */
	mediaViewer,
	/**
	 * Internal for use inside Minerva only.
	 *
	 * @memberof module:mobile.startup
	 * @type module:mobile.startup/references
	 */
	references,
	/**
	 * Internal for use inside Minerva only.
	 *
	 * @memberof module:mobile.startup
	 * @type module:mobile.startup/search
	 */
	search,
	/**
	 * Internal for use inside Minerva only.
	 *
	 * @memberof module:mobile.startup
	 * @type module:mobile.startup/time
	 */
	time,
	// Internal for use inside Echo, GrowthExperiments only.
	promisedView,
	/**
	 * Loads all images on the page, stable to call.
	 *
	 * @memberof module:mobile.startup
	 * @return {jQuery.Deferred}
	 */
	loadAllImagesInPage: () => lazyImageLoader.loadImages(
		lazyImageLoader.queryPlaceholders( document.getElementById( 'content' ) )
	),
	/**
	 * Show a notification on page reload, internal for Minerva
	 *
	 * @memberof module:mobile.startup
	 * @param {string} msg
	 * @return {jQuery.Deferred}
	 */
	notifyOnPageReload: ( msg ) => showOnPageReload( msg ),
	/**
	 * Internal for use inside VisualEditor
	 *
	 * @memberof module:mobile.startup
	 * @return {string|undefined}
	 */
	license() {
		const skin = Skin.getSingleton();
		return skin.getLicenseMsg();
	},
	/**
	 * Internal for use inside Minerva. See {@link module:mobile.startup} for access.
	 *
	 * @module mobile.startup/languages
	 */
	/**
	 * Access to language overlays for usage inside Minerva only.
	 *
	 * @memberof module:mobile.startup
	 * @type module:mobile.startup/languages
	 */
	languages: {
		languageOverlay,
		/**
		 * Shows information about suggested languages.
		 *
		 * @memberof module:mobile.startup/languages
		 * @param {mw.Api} api
		 * @param {boolean} showSuggestedLanguage If the suggested languages section
		 * should be rendered.
		 */
		languageInfoOverlay( api, showSuggestedLanguage ) {
			return languageInfoOverlay( new LanguageInfo( api ), showSuggestedLanguage );
		}
	}
};