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

import {
	MessageBoxOptions,
	MessageBoxReturnValue,
	OpenDevToolsOptions,
	OpenDialogOptions,
	OpenDialogReturnValue,
	SaveDialogOptions,
	SaveDialogReturnValue,
} from 'electron';
import { Event } from '@sussudio/base/common/event.mjs';
import { Disposable } from '@sussudio/base/common/lifecycle.mjs';
import { AddFirstParameterToFunctions } from '@sussudio/base/common/types.mjs';
import { URI } from '@sussudio/base/common/uri.mjs';
import { MouseInputEvent } from '@sussudio/base/parts/sandbox/common/electronTypes.mjs';
import { ISerializableCommandAction } from '../../action/common/action.mjs';
import { INativeOpenDialogOptions } from '../../dialogs/common/dialogs.mjs';
import { IDialogMainService } from '../../dialogs/electron-main/dialogMainService.mjs';
import { IEnvironmentMainService } from '../../environment/electron-main/environmentMainService.mjs';
import { ILifecycleMainService } from '../../lifecycle/electron-main/lifecycleMainService.mjs';
import { ILogService } from '../../log/common/log.mjs';
import { ICommonNativeHostService, IOSProperties, IOSStatistics } from '../common/native.mjs';
import { IProductService } from '../../product/common/productService.mjs';
import { ISharedProcess } from '../../sharedProcess/node/sharedProcess.mjs';
import { IPartsSplash } from '../../theme/common/themeService.mjs';
import { IThemeMainService } from '../../theme/electron-main/themeMainService.mjs';
import {
	IColorScheme,
	IOpenedWindow,
	IOpenEmptyWindowOptions,
	IOpenWindowOptions,
	IWindowOpenable,
} from '../../window/common/window.mjs';
import { IWindowsMainService } from '../../windows/electron-main/windows.mjs';
import { IWorkspacesManagementMainService } from '../../workspaces/electron-main/workspacesManagementMainService.mjs';
import { VSBuffer } from '@sussudio/base/common/buffer.mjs';
import { IV8Profile } from '../../profiling/common/profiling.mjs';
import { IStateMainService } from '../../state/electron-main/state.mjs';
export interface INativeHostMainService
	extends AddFirstParameterToFunctions<ICommonNativeHostService, Promise<unknown>, number | undefined> {}
export declare const INativeHostMainService: import('../../instantiation/common/instantiation.mjs').ServiceIdentifier<INativeHostMainService>;
export declare class NativeHostMainService extends Disposable implements INativeHostMainService {
	private sharedProcess;
	private readonly windowsMainService;
	private readonly dialogMainService;
	private readonly lifecycleMainService;
	private readonly environmentMainService;
	private readonly logService;
	private readonly productService;
	private readonly themeMainService;
	private readonly stateMainService;
	private readonly workspacesManagementMainService;
	readonly _serviceBrand: undefined;
	constructor(
		sharedProcess: ISharedProcess,
		windowsMainService: IWindowsMainService,
		dialogMainService: IDialogMainService,
		lifecycleMainService: ILifecycleMainService,
		environmentMainService: IEnvironmentMainService,
		logService: ILogService,
		productService: IProductService,
		themeMainService: IThemeMainService,
		stateMainService: IStateMainService,
		workspacesManagementMainService: IWorkspacesManagementMainService,
	);
	get windowId(): never;
	readonly onDidOpenWindow: Event<number>;
	readonly onDidTriggerSystemContextMenu: Event<{
		windowId: number;
		x: number;
		y: number;
	}>;
	readonly onDidMaximizeWindow: Event<number>;
	readonly onDidUnmaximizeWindow: Event<number>;
	readonly onDidBlurWindow: Event<number>;
	readonly onDidFocusWindow: Event<number>;
	readonly onDidResumeOS: Event<unknown>;
	readonly onDidChangeColorScheme: Event<IColorScheme>;
	private readonly _onDidChangePassword;
	readonly onDidChangePassword: Event<{
		account: string;
		service: string;
	}>;
	readonly onDidChangeDisplay: Event<void>;
	getWindows(): Promise<IOpenedWindow[]>;
	getWindowCount(windowId: number | undefined): Promise<number>;
	getActiveWindowId(windowId: number | undefined): Promise<number | undefined>;
	openWindow(windowId: number | undefined, options?: IOpenEmptyWindowOptions): Promise<void>;
	openWindow(windowId: number | undefined, toOpen: IWindowOpenable[], options?: IOpenWindowOptions): Promise<void>;
	private doOpenWindow;
	private doOpenEmptyWindow;
	toggleFullScreen(windowId: number | undefined): Promise<void>;
	handleTitleDoubleClick(windowId: number | undefined): Promise<void>;
	isMaximized(windowId: number | undefined): Promise<boolean>;
	maximizeWindow(windowId: number | undefined): Promise<void>;
	unmaximizeWindow(windowId: number | undefined): Promise<void>;
	minimizeWindow(windowId: number | undefined): Promise<void>;
	updateWindowControls(
		windowId: number | undefined,
		options: {
			height?: number;
			backgroundColor?: string;
			foregroundColor?: string;
		},
	): Promise<void>;
	focusWindow(
		windowId: number | undefined,
		options?: {
			windowId?: number;
			force?: boolean;
		},
	): Promise<void>;
	setMinimumSize(windowId: number | undefined, width: number | undefined, height: number | undefined): Promise<void>;
	saveWindowSplash(windowId: number | undefined, splash: IPartsSplash): Promise<void>;
	installShellCommand(windowId: number | undefined): Promise<void>;
	uninstallShellCommand(windowId: number | undefined): Promise<void>;
	private getShellCommandLink;
	showMessageBox(windowId: number | undefined, options: MessageBoxOptions): Promise<MessageBoxReturnValue>;
	showSaveDialog(windowId: number | undefined, options: SaveDialogOptions): Promise<SaveDialogReturnValue>;
	showOpenDialog(windowId: number | undefined, options: OpenDialogOptions): Promise<OpenDialogReturnValue>;
	private toBrowserWindow;
	pickFileFolderAndOpen(windowId: number | undefined, options: INativeOpenDialogOptions): Promise<void>;
	pickFolderAndOpen(windowId: number | undefined, options: INativeOpenDialogOptions): Promise<void>;
	pickFileAndOpen(windowId: number | undefined, options: INativeOpenDialogOptions): Promise<void>;
	pickWorkspaceAndOpen(windowId: number | undefined, options: INativeOpenDialogOptions): Promise<void>;
	private doOpenPicked;
	showItemInFolder(windowId: number | undefined, path: string): Promise<void>;
	setRepresentedFilename(windowId: number | undefined, path: string): Promise<void>;
	setDocumentEdited(windowId: number | undefined, edited: boolean): Promise<void>;
	openExternal(windowId: number | undefined, url: string): Promise<boolean>;
	private safeSnapOpenExternal;
	moveItemToTrash(windowId: number | undefined, fullPath: string): Promise<void>;
	isAdmin(): Promise<boolean>;
	writeElevated(
		windowId: number | undefined,
		source: URI,
		target: URI,
		options?: {
			unlock?: boolean;
		},
	): Promise<void>;
	private get cliPath();
	getOSStatistics(): Promise<IOSStatistics>;
	getOSProperties(): Promise<IOSProperties>;
	getOSVirtualMachineHint(): Promise<number>;
	getOSColorScheme(): Promise<IColorScheme>;
	hasWSLFeatureInstalled(): Promise<boolean>;
	killProcess(windowId: number | undefined, pid: number, code: string): Promise<void>;
	readClipboardText(windowId: number | undefined, type?: 'selection' | 'clipboard'): Promise<string>;
	writeClipboardText(windowId: number | undefined, text: string, type?: 'selection' | 'clipboard'): Promise<void>;
	readClipboardFindText(windowId: number | undefined): Promise<string>;
	writeClipboardFindText(windowId: number | undefined, text: string): Promise<void>;
	writeClipboardBuffer(
		windowId: number | undefined,
		format: string,
		buffer: VSBuffer,
		type?: 'selection' | 'clipboard',
	): Promise<void>;
	readClipboardBuffer(windowId: number | undefined, format: string): Promise<VSBuffer>;
	hasClipboard(windowId: number | undefined, 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(windowId: number | undefined, items: ISerializableCommandAction[][]): Promise<void>;
	notifyReady(windowId: number | undefined): Promise<void>;
	relaunch(
		windowId: number | undefined,
		options?: {
			addArgs?: string[];
			removeArgs?: string[];
		},
	): Promise<void>;
	reload(
		windowId: number | undefined,
		options?: {
			disableExtensions?: boolean;
		},
	): Promise<void>;
	closeWindow(windowId: number | undefined): Promise<void>;
	closeWindowById(currentWindowId: number | undefined, targetWindowId?: number | undefined): Promise<void>;
	quit(windowId: number | undefined): Promise<void>;
	exit(windowId: number | undefined, code: number): Promise<void>;
	resolveProxy(windowId: number | undefined, url: string): Promise<string | undefined>;
	findFreePort(
		windowId: number | undefined,
		startPort: number,
		giveUpAfter: number,
		timeout: number,
		stride?: number,
	): Promise<number>;
	openDevTools(windowId: number | undefined, options?: OpenDevToolsOptions): Promise<void>;
	toggleDevTools(windowId: number | undefined): Promise<void>;
	sendInputEvent(windowId: number | undefined, event: MouseInputEvent): Promise<void>;
	enableSandbox(windowId: number | undefined, enabled: boolean): Promise<void>;
	toggleSharedProcessWindow(): Promise<void>;
	profileRenderer(windowId: number | undefined, session: string, duration: number): Promise<IV8Profile>;
	windowsGetStringRegKey(
		windowId: number | undefined,
		hive: 'HKEY_CURRENT_USER' | 'HKEY_LOCAL_MACHINE' | 'HKEY_CLASSES_ROOT' | 'HKEY_USERS' | 'HKEY_CURRENT_CONFIG',
		path: string,
		name: string,
	): Promise<string | undefined>;
	private windowById;
}
