/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

import { VSBuffer } from '@sussudio/base/common/buffer.mjs';
import { Event } from '@sussudio/base/common/event.mjs';
import { URI } from '@sussudio/base/common/uri.mjs';
import {
	MessageBoxOptions,
	MessageBoxReturnValue,
	MouseInputEvent,
	OpenDevToolsOptions,
	OpenDialogOptions,
	OpenDialogReturnValue,
	SaveDialogOptions,
	SaveDialogReturnValue,
} from '@sussudio/base/parts/sandbox/common/electronTypes.mjs';
import { ISerializableCommandAction } from '../../action/common/action.mjs';
import { INativeOpenDialogOptions } from '../../dialogs/common/dialogs.mjs';
import { IV8Profile } from '../../profiling/common/profiling.mjs';
import { IPartsSplash } from '../../theme/common/themeService.mjs';
import {
	IColorScheme,
	IOpenedWindow,
	IOpenEmptyWindowOptions,
	IOpenWindowOptions,
	IWindowOpenable,
} from '../../window/common/window.mjs';
export interface ICPUProperties {
	model: string;
	speed: number;
}
export interface IOSProperties {
	type: string;
	release: string;
	arch: string;
	platform: string;
	cpus: ICPUProperties[];
}
export interface IOSStatistics {
	totalmem: number;
	freemem: number;
	loadavg: number[];
}
export interface ICommonNativeHostService {
	readonly _serviceBrand: undefined;
	readonly windowId: number;
	readonly onDidOpenWindow: Event<number>;
	readonly onDidMaximizeWindow: Event<number>;
	readonly onDidUnmaximizeWindow: Event<number>;
	readonly onDidFocusWindow: Event<number>;
	readonly onDidBlurWindow: Event<number>;
	readonly onDidChangeDisplay: Event<void>;
	readonly onDidResumeOS: Event<unknown>;
	readonly onDidChangeColorScheme: Event<IColorScheme>;
	readonly onDidChangePassword: Event<{
		service: string;
		account: string;
	}>;
	readonly onDidTriggerSystemContextMenu: Event<{
		windowId: number;
		x: number;
		y: number;
	}>;
	getWindows(): Promise<IOpenedWindow[]>;
	getWindowCount(): Promise<number>;
	getActiveWindowId(): Promise<number | undefined>;
	openWindow(options?: IOpenEmptyWindowOptions): Promise<void>;
	openWindow(toOpen: IWindowOpenable[], options?: IOpenWindowOptions): Promise<void>;
	toggleFullScreen(): Promise<void>;
	handleTitleDoubleClick(): Promise<void>;
	isMaximized(): Promise<boolean>;
	maximizeWindow(): Promise<void>;
	unmaximizeWindow(): Promise<void>;
	minimizeWindow(): Promise<void>;
	/**
	 * Only supported on Windows and macOS. Updates the window controls to match the title bar size.
	 *
	 * @param options `backgroundColor` and `foregroundColor` are only supported on Windows
	 */
	updateWindowControls(options: { height?: number; backgroundColor?: string; foregroundColor?: string }): Promise<void>;
	setMinimumSize(width: number | undefined, height: number | undefined): Promise<void>;
	saveWindowSplash(splash: IPartsSplash): Promise<void>;
	/**
	 * Make the window focused.
	 *
	 * @param options Pass `force: true` if you want to make the window take
	 * focus even if the application does not have focus currently. This option
	 * should only be used if it is necessary to steal focus from the current
	 * focused application which may not be VSCode.
	 */
	focusWindow(options?: { windowId?: number; force?: boolean }): Promise<void>;
	showMessageBox(options: MessageBoxOptions): Promise<MessageBoxReturnValue>;
	showSaveDialog(options: SaveDialogOptions): Promise<SaveDialogReturnValue>;
	showOpenDialog(options: OpenDialogOptions): Promise<OpenDialogReturnValue>;
	pickFileFolderAndOpen(options: INativeOpenDialogOptions): Promise<void>;
	pickFileAndOpen(options: INativeOpenDialogOptions): Promise<void>;
	pickFolderAndOpen(options: INativeOpenDialogOptions): Promise<void>;
	pickWorkspaceAndOpen(options: INativeOpenDialogOptions): Promise<void>;
	showItemInFolder(path: string): Promise<void>;
	setRepresentedFilename(path: string): Promise<void>;
	setDocumentEdited(edited: boolean): Promise<void>;
	openExternal(url: string): Promise<boolean>;
	moveItemToTrash(fullPath: string): Promise<void>;
	isAdmin(): Promise<boolean>;
	writeElevated(
		source: URI,
		target: URI,
		options?: {
			unlock?: boolean;
		},
	): Promise<void>;
	getOSProperties(): Promise<IOSProperties>;
	getOSStatistics(): Promise<IOSStatistics>;
	getOSVirtualMachineHint(): Promise<number>;
	getOSColorScheme(): Promise<IColorScheme>;
	hasWSLFeatureInstalled(): Promise<boolean>;
	killProcess(pid: number, code: string): Promise<void>;
	readClipboardText(type?: 'selection' | 'clipboard'): Promise<string>;
	writeClipboardText(text: string, type?: 'selection' | 'clipboard'): Promise<void>;
	readClipboardFindText(): Promise<string>;
	writeClipboardFindText(text: string): Promise<void>;
	writeClipboardBuffer(format: string, buffer: VSBuffer, type?: 'selection' | 'clipboard'): Promise<void>;
	readClipboardBuffer(format: string): Promise<VSBuffer>;
	hasClipboard(format: string, type?: 'selection' | 'clipboard'): Promise<boolean>;
	newWindowTab(): Promise<void>;
	showPreviousWindowTab(): Promise<void>;
	showNextWindowTab(): Promise<void>;
	moveWindowTabToNewWindow(): Promise<void>;
	mergeAllWindowTabs(): Promise<void>;
	toggleWindowTabsBar(): Promise<void>;
	updateTouchBar(items: ISerializableCommandAction[][]): Promise<void>;
	installShellCommand(): Promise<void>;
	uninstallShellCommand(): Promise<void>;
	notifyReady(): Promise<void>;
	relaunch(options?: { addArgs?: string[]; removeArgs?: string[] }): Promise<void>;
	reload(options?: { disableExtensions?: boolean }): Promise<void>;
	closeWindow(): Promise<void>;
	closeWindowById(windowId: number): Promise<void>;
	quit(): Promise<void>;
	exit(code: number): Promise<void>;
	openDevTools(options?: OpenDevToolsOptions): Promise<void>;
	toggleDevTools(): Promise<void>;
	toggleSharedProcessWindow(): Promise<void>;
	sendInputEvent(event: MouseInputEvent): Promise<void>;
	enableSandbox(enabled: boolean): Promise<void>;
	profileRenderer(session: string, duration: number): Promise<IV8Profile>;
	resolveProxy(url: string): Promise<string | undefined>;
	findFreePort(startPort: number, giveUpAfter: number, timeout: number, stride?: number): Promise<number>;
	windowsGetStringRegKey(
		hive: 'HKEY_CURRENT_USER' | 'HKEY_LOCAL_MACHINE' | 'HKEY_CLASSES_ROOT' | 'HKEY_USERS' | 'HKEY_CURRENT_CONFIG',
		path: string,
		name: string,
	): Promise<string | undefined>;
}
