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

import { Disposable } from '@sussudio/base/common/lifecycle.mjs';
import { IProcessEnvironment, OperatingSystem } from '@sussudio/base/common/platform.mjs';
import { IConfigurationService } from '../../configuration/common/configuration.mjs';
import { INativeEnvironmentService } from '../../environment/common/environment.mjs';
import { ILogService } from '../../log/common/log.mjs';
import {
	IProcessDataEvent,
	IPtyService,
	IReconnectConstants,
	IRequestResolveVariablesEvent,
	IShellLaunchConfig,
	ITerminalLaunchError,
	ITerminalProfile,
	ITerminalsLayoutInfo,
	TerminalIcon,
	IProcessProperty,
	TitleEventSource,
	ProcessPropertyType,
	IProcessPropertyMap,
	ISerializedTerminalState,
	ITerminalProcessOptions,
} from '../common/terminal.mjs';
import { IGetTerminalLayoutInfoArgs, IProcessDetails, ISetTerminalLayoutInfoArgs } from '../common/terminalProcess.mjs';
import { IPtyHostProcessReplayEvent } from '../common/capabilities/capabilities.mjs';
/**
 * This service implements IPtyService by launching a pty host process, forwarding messages to and
 * from the pty host process and manages the connection.
 */
export declare class PtyHostService extends Disposable implements IPtyService {
	private readonly _reconnectConstants;
	private readonly _configurationService;
	private readonly _environmentService;
	private readonly _logService;
	readonly _serviceBrand: undefined;
	private _client;
	private _proxy;
	private readonly _shellEnv;
	private readonly _resolveVariablesRequestStore;
	private _restartCount;
	private _isResponsive;
	private _isDisposed;
	private _heartbeatFirstTimeout?;
	private _heartbeatSecondTimeout?;
	private readonly _onPtyHostExit;
	readonly onPtyHostExit: import('@sussudio/base/common/event.mjs').Event<number>;
	private readonly _onPtyHostStart;
	readonly onPtyHostStart: import('@sussudio/base/common/event.mjs').Event<void>;
	private readonly _onPtyHostUnresponsive;
	readonly onPtyHostUnresponsive: import('@sussudio/base/common/event.mjs').Event<void>;
	private readonly _onPtyHostResponsive;
	readonly onPtyHostResponsive: import('@sussudio/base/common/event.mjs').Event<void>;
	private readonly _onPtyHostRequestResolveVariables;
	readonly onPtyHostRequestResolveVariables: import('@sussudio/base/common/event.mjs').Event<IRequestResolveVariablesEvent>;
	private readonly _onProcessData;
	readonly onProcessData: import('@sussudio/base/common/event.mjs').Event<{
		id: number;
		event: IProcessDataEvent | string;
	}>;
	private readonly _onProcessReady;
	readonly onProcessReady: import('@sussudio/base/common/event.mjs').Event<{
		id: number;
		event: {
			pid: number;
			cwd: string;
		};
	}>;
	private readonly _onProcessReplay;
	readonly onProcessReplay: import('@sussudio/base/common/event.mjs').Event<{
		id: number;
		event: IPtyHostProcessReplayEvent;
	}>;
	private readonly _onProcessOrphanQuestion;
	readonly onProcessOrphanQuestion: import('@sussudio/base/common/event.mjs').Event<{
		id: number;
	}>;
	private readonly _onDidRequestDetach;
	readonly onDidRequestDetach: import('@sussudio/base/common/event.mjs').Event<{
		requestId: number;
		workspaceId: string;
		instanceId: number;
	}>;
	private readonly _onDidChangeProperty;
	readonly onDidChangeProperty: import('@sussudio/base/common/event.mjs').Event<{
		id: number;
		property: IProcessProperty<any>;
	}>;
	private readonly _onProcessExit;
	readonly onProcessExit: import('@sussudio/base/common/event.mjs').Event<{
		id: number;
		event: number | undefined;
	}>;
	constructor(
		_reconnectConstants: IReconnectConstants,
		_configurationService: IConfigurationService,
		_environmentService: INativeEnvironmentService,
		_logService: ILogService,
	);
	initialize(): void;
	private get _ignoreProcessNames();
	private _refreshIgnoreProcessNames;
	private _resolveShellEnv;
	private _startPtyHost;
	dispose(): void;
	createProcess(
		shellLaunchConfig: IShellLaunchConfig,
		cwd: string,
		cols: number,
		rows: number,
		unicodeVersion: '6' | '11',
		env: IProcessEnvironment,
		executableEnv: IProcessEnvironment,
		options: ITerminalProcessOptions,
		shouldPersist: boolean,
		workspaceId: string,
		workspaceName: string,
	): Promise<number>;
	updateTitle(id: number, title: string, titleSource: TitleEventSource): Promise<void>;
	updateIcon(id: number, userInitiated: boolean, icon: TerminalIcon, color?: string): Promise<void>;
	attachToProcess(id: number): Promise<void>;
	detachFromProcess(id: number, forcePersist?: boolean): Promise<void>;
	listProcesses(): Promise<IProcessDetails[]>;
	reduceConnectionGraceTime(): Promise<void>;
	start(id: number): Promise<ITerminalLaunchError | undefined>;
	shutdown(id: number, immediate: boolean): Promise<void>;
	input(id: number, data: string): Promise<void>;
	processBinary(id: number, data: string): Promise<void>;
	resize(id: number, cols: number, rows: number): Promise<void>;
	acknowledgeDataEvent(id: number, charCount: number): Promise<void>;
	setUnicodeVersion(id: number, version: '6' | '11'): Promise<void>;
	getInitialCwd(id: number): Promise<string>;
	getCwd(id: number): Promise<string>;
	getLatency(id: number): Promise<number>;
	orphanQuestionReply(id: number): Promise<void>;
	installAutoReply(match: string, reply: string): Promise<void>;
	uninstallAllAutoReplies(): Promise<void>;
	uninstallAutoReply(match: string): Promise<void>;
	getDefaultSystemShell(osOverride?: OperatingSystem): Promise<string>;
	getProfiles(
		workspaceId: string,
		profiles: unknown,
		defaultProfile: unknown,
		includeDetectedProfiles?: boolean,
	): Promise<ITerminalProfile[]>;
	getEnvironment(): Promise<IProcessEnvironment>;
	getWslPath(original: string, direction: 'unix-to-win' | 'win-to-unix'): Promise<string>;
	getRevivedPtyNewId(id: number): Promise<number | undefined>;
	setTerminalLayoutInfo(args: ISetTerminalLayoutInfoArgs): Promise<void>;
	getTerminalLayoutInfo(args: IGetTerminalLayoutInfoArgs): Promise<ITerminalsLayoutInfo | undefined>;
	requestDetachInstance(workspaceId: string, instanceId: number): Promise<IProcessDetails | undefined>;
	acceptDetachInstanceReply(requestId: number, persistentProcessId: number): Promise<void>;
	freePortKillProcess(port: string): Promise<{
		port: string;
		processId: string;
	}>;
	serializeTerminalState(ids: number[]): Promise<string>;
	reviveTerminalProcesses(state: ISerializedTerminalState[], dateTimeFormatLocate: string): Promise<void>;
	refreshProperty<T extends ProcessPropertyType>(id: number, property: T): Promise<IProcessPropertyMap[T]>;
	updateProperty<T extends ProcessPropertyType>(id: number, property: T, value: IProcessPropertyMap[T]): Promise<void>;
	restartPtyHost(): Promise<void>;
	private _disposePtyHost;
	private _handleHeartbeat;
	private _handleHeartbeatFirstTimeout;
	private _handleHeartbeatSecondTimeout;
	private _handleUnresponsiveCreateProcess;
	private _clearHeartbeatTimeouts;
	private _resolveVariables;
	acceptPtyHostResolvedVariables(requestId: number, resolved: string[]): Promise<void>;
}
