import {ChromeGpuModes} from "./types";

/**
 * Global installation and setup preferences for IronPDF
 *
 * See {@link IronPdfGlobalConfig.setConfig}
 */
export class IronPdfGlobalConfig {
	private static _instance: IronPdfGlobalConfig;

	private static _config: IronPdfConfig = {
		ironPdfEngineAddress: "127.0.0.1:33350",
		ironPdfEngineDockerAddress: undefined,
		debugMode: false,
		licenseKey: undefined,
	};
	private constructor() {
		if (IronPdfGlobalConfig._instance) {
			throw new Error(
				"Error: Instantiation failed: Use Access.getInstance() instead of new."
			);
		}
		IronPdfGlobalConfig._instance = this;
	}

	public static getInstance() {
		return IronPdfGlobalConfig._instance || (IronPdfGlobalConfig._instance = new IronPdfGlobalConfig());
	}

	/**
	 * Main IronPdf configuration method
	 *
	 * @param ironPdfConfig configuration see {@link IronPdfConfig}
	 */
	public static setConfig(ironPdfConfig: IronPdfConfig) {
		if (ironPdfConfig.debugMode != undefined) {
			IronPdfGlobalConfig._config.debugMode = ironPdfConfig.debugMode;
		}
		if (ironPdfConfig.licenseKey) {
			IronPdfGlobalConfig._config.licenseKey = ironPdfConfig.licenseKey;
		}
		if (ironPdfConfig.ironPdfEngineAddress) {
			IronPdfGlobalConfig._config.ironPdfEngineAddress =
				ironPdfConfig.ironPdfEngineAddress;
		}
		if (ironPdfConfig.ironPdfEngineDockerAddress) {
			IronPdfGlobalConfig._config.ironPdfEngineDockerAddress =
				ironPdfConfig.ironPdfEngineDockerAddress;
		}
	}

	public static getConfig(): IronPdfConfig {
		return IronPdfGlobalConfig._config;
	}

	public static ironPdfEngineVersion: string =
		// eslint-disable-next-line @typescript-eslint/no-var-requires
		require(`../../package.json`).ironPdfEngineVersion;
}

/**
 * Main IronPdf configuration interface
 */
export interface IronPdfConfig {
	/**
	 * An address of IronPdf subprocess.
	 * @default 127.0.0.1:33350
	 */
	ironPdfEngineAddress?: string | undefined;
	/**
	 * An address of IronPdfEngine Docker.
	 *
	 * If this config was specified IronPdf will switch to Docker mode
	 *
	 * Docker mode: IronPdf will not spawn subprocess but will connect to Docker instead.
	 *
	 * @default undefined
	 */
	ironPdfEngineDockerAddress?: string | undefined;
	/**
	 * Enable debug mode
	 *
	 * Debug mode: IronPdf will expose more logging messages
	 *
	 * @default false
	 */
	debugMode?: boolean | undefined;
	/**
	 * Removes watermarks. Get licensed at https://ironpdf.com/nodejs/licensing.
	 *
	 * For Node.js applications, a license key can alternatively be set using the environment variable IRONPDF_LICENSE_KEY.
	 * Priority: programmatic licenseKey > IRONPDF_LICENSE_KEY environment variable.
	 *
	 * For .Net framework applications, a license key can alternatively be added to Web.Config or App.Config XML file using
	 * <add key="IronPdf.LicenseKey" value="IRONPDF-LICENSE-KEY"/> within the appSettings tag. See
	 * https://ironpdf.com/nodejs/docs/license/license-keys/ for more details.
	 *
	 * For .Net Core applications, a license key may be added to appsettings.json where the key name is "IronPdf.LicenseKey" and the value is a valid IronPDF trial or full license key.
	 *
	 * See https://ironpdf.com/nodejs/licensing/ for licensing options.
	 *
	 * @default undefined
	 */
	licenseKey?: string | undefined;
	/**
	 * SingleProcess mode Forces Chrome renderer to perform everything in the current process, rather than using subprocesses (default true for macOS, false for other OS)
	 * @default false
	 */
	singleProcess?: boolean | undefined;
	/**
	 * Set Maximum number of concurrent browsers when using the Chrome renderer
	 * @default 30
	 */
	chromeBrowserLimit?: number | undefined;
	/**
	 * Disk cache path for Chrome browser instances
	 * @default undefined
	 */
	chromeBrowserCachePath?: string | undefined;
	/**
	 * Chrome renderer GPU compatibility mode. In special environment like Docker or Cloud Service please use ChromeGpuModes "Disabled"
	 * @default {@link ChromeGpuModes.Disabled}
	 */
	chromeGpuMode?:ChromeGpuModes | undefined;
	/**
	 * If true The necessary package dependencies for IronPDF rendering will we automatically installed to
	 * Docker and Debian / Ubuntu Linux deployments.
	 * This will take a few minutes the next time you run IronPDF.
	 * Set this to false if manual Docker / Linux setup is more convenient:
	 * <a href="https://ironpdf.com/docs/questions/docker-linux/">more info</a>
	 * @default true
	 */
	autoInstallDependency?: boolean | undefined;
}
