import { InitData, SharedProcessData } from "@coder/protocol";

class Paths {
	private _appData: string | undefined;
	private _defaultUserData: string | undefined;
	private _socketPath: string | undefined;
	private _builtInExtensionsDirectory: string | undefined;
	private _workingDirectory: string | undefined;

	public get appData(): string {
		if (typeof this._appData === "undefined") {
			throw new Error("trying to access appData before it has been set");
		}

		return this._appData;
	}

	public get defaultUserData(): string {
		if (typeof this._defaultUserData === "undefined") {
			throw new Error("trying to access defaultUserData before it has been set");
		}

		return this._defaultUserData;
	}

	public get socketPath(): string {
		if (typeof this._socketPath === "undefined") {
			throw new Error("trying to access socketPath before it has been set");
		}

		return this._socketPath;
	}

	public get builtInExtensionsDirectory(): string {
		if (!this._builtInExtensionsDirectory) {
			throw new Error("trying to access builtin extensions directory before it has been set");
		}

		return this._builtInExtensionsDirectory;
	}

	public get workingDirectory(): string {
		if (!this._workingDirectory) {
			throw new Error("trying to access working directory before it has been set");
		}

		return this._workingDirectory;
	}

	public initialize(data: InitData, sharedData: SharedProcessData): void {
		process.env.VSCODE_LOGS = sharedData.logPath;
		this._appData = data.dataDirectory;
		this._defaultUserData = data.dataDirectory;
		this._socketPath = sharedData.socketPath;
		this._builtInExtensionsDirectory = data.builtInExtensionsDirectory;
		this._workingDirectory = data.workingDirectory;
	}
}

export const _paths = new Paths();
export const getAppDataPath = (): string => _paths.appData;
export const getDefaultUserDataPath = (): string => _paths.defaultUserData;
export const getWorkingDirectory = (): string => _paths.workingDirectory;
export const getBuiltInExtensionsDirectory = (): string => _paths.builtInExtensionsDirectory;
export const getSocketPath = (): string => _paths.socketPath;
