/**
 * window.StreamSeraAdminApi — what add-on admin bundles build on.
 * Everything an add-on screen needs to look and behave like a core screen.
 */
import * as element from '@wordpress/element';
import * as components from '@wordpress/components';
import * as i18n from '@wordpress/i18n';
import apiFetch from '@wordpress/api-fetch';
import {
	registerPage,
	getPage,
	getPages,
	registerPageAction,
	getPageActions,
	registerDashboardCard,
	getDashboardCards,
	onPagesChange,
} from './registry';
import { navigate, Link, useRoute, hrefFor } from './router';
import * as uiBase from './ui';
import { CodeBox } from './EmbedModal';
// `ui` for add-ons: the shared components plus the embed dialog's CodeBox (copy works on http:// too).
const ui = { ...uiBase, CodeBox };
import * as api from './api';
import { useNotice } from './App';
import {
	registerBuilderSection,
	getBuilderSections,
	registerSettingsSection,
	getSettingsSections,
	registerSettingsGroup,
	registerExtension,
	getExtensions,
	registerEnginePlugin,
	registerPreviewLoader,
	registerSourceType,
	registerBuilderComponent,
	getBuilderComponents,
	registerEmbedTab,
	onExtensionsChange,
} from '../player/extensions';
import { registerCommand, unregisterCommand, openPalette } from './commands';
import { registerHeaderUtility } from './ui';
import Player, {
	registerLayout,
	parts,
	Powered,
	deviceFor,
} from '../player/Player';
import * as appearance from './features/appearance';

export function exposeAdminApi() {
	( window as any ).StreamSeraAdminApi = Object.assign(
		( window as any ).StreamSeraAdminApi || {},
		{
			version: window.StreamSeraAdmin?.version,
			element,
			components,
			i18n,
			apiFetch,
			registerPage,
			getPage,
			getPages,
			onPagesChange,
			registerDashboardCard,
			getDashboardCards,
			registerPageAction,
			getPageActions,
			navigate,
			Link,
			useRoute,
			hrefFor,
			ui,
			api,
			useNotice,
			registerBuilderSection,
			getBuilderSections,
			registerSettingsSection,
			getSettingsSections,
			registerSettingsGroup,
			registerExtension,
			getExtensions,
			registerEnginePlugin,
			registerPreviewLoader,
			registerSourceType,
			registerBuilderComponent,
			getBuilderComponents,
			registerEmbedTab,
			registerLayout,
			onExtensionsChange,
			Player,
			registerCommand,
			unregisterCommand,
			openPalette,
			registerHeaderUtility,
			parts,
			Powered,
			deviceFor,
			appearance,
		}
	);
	window.dispatchEvent( new Event( 'streamsera:admin-ready' ) );
}
