/*
 * Copyright (c) 2022 ETH Zürich, Educational Development and Technology (LET)
 * 
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

using System;

namespace SafeExamBrowser.Configuration.Contracts
{
	/// <summary>
	/// Defines the fundamental, global configuration information for all application components.
	/// </summary>
	[Serializable]
	public class AppConfig
	{
		/// <summary>
		/// The name of the backup data file used by the service component.
		/// </summary>
		public const string BACKUP_FILE_NAME = "Backup.bin";

		/// <summary>
		/// The base address for all communication hosts of the application.
		/// </summary>
		public const string BASE_ADDRESS = "net.pipe://localhost/safeexambrowser";

		/// <summary>
		/// The name of the synchronization primitive for the client component.
		/// </summary>
		public const string CLIENT_MUTEX_NAME = "safe_exam_browser_client_mutex";

		/// <summary>
		/// The name of the synchronization primitive for the runtime component.
		/// </summary>
		public const string RUNTIME_MUTEX_NAME = "safe_exam_browser_runtime_mutex";

		/// <summary>
		/// The communication address of the service component.
		/// </summary>
		public const string SERVICE_ADDRESS = BASE_ADDRESS + "/service";

		/// <summary>
		/// The name of the synchronization primitive for the service component.
		/// </summary>
		public const string SERVICE_MUTEX_NAME = "safe_exam_browser_reset_mutex";

		/// <summary>
		/// The file path of the local client configuration for the active user.
		/// </summary>
		public string AppDataFilePath { get; set; }

		/// <summary>
		/// The point in time when the application was started.
		/// </summary>
		public DateTime ApplicationStartTime { get; set; }

		/// <summary>
		/// The path where the browser cache is to be stored.
		/// </summary>
		public string BrowserCachePath { get; set; }

		/// <summary>
		/// The file path under which the log of the browser component is to be stored.
		/// </summary>
		public string BrowserLogFilePath { get; set; }

		/// <summary>
		/// The communication address of the client component.
		/// </summary>
		public string ClientAddress { get; set; }

		/// <summary>
		/// The executable path of the client compontent.
		/// </summary>
		public string ClientExecutablePath { get; set; }

		/// <summary>
		/// The unique identifier for the currently running client instance.
		/// </summary>
		public Guid ClientId { get; set; }

		/// <summary>
		/// The file path under which the log of the client component is to be stored.
		/// </summary>
		public string ClientLogFilePath { get; set; }

		/// <summary>
		/// The hash value of the certificate used to sign the application binaries, or <c>null</c> if the binaries are unsigned.
		/// </summary>
		public string CodeSignatureHash { get; set; }

		/// <summary>
		/// The file extension of configuration files for the application (including the period).
		/// </summary>
		public string ConfigurationFileExtension { get; set; }

		/// <summary>
		/// The MIME type of configuration files for the application.
		/// </summary>
		public string ConfigurationFileMimeType { get; set; }

		/// <summary>
		/// The build version of the application.
		/// </summary>
		public string ProgramBuildVersion { get; set; }

		/// <summary>
		/// The copyright information for the application.
		/// </summary>
		public string ProgramCopyright { get; set; }

		/// <summary>
		/// The file path of the local client configuration for all users.
		/// </summary>
		public string ProgramDataFilePath { get; set; }

		/// <summary>
		/// The program title of the application.
		/// </summary>
		public string ProgramTitle { get; set; }

		/// <summary>
		/// The informational version of the application.
		/// </summary>
		public string ProgramInformationalVersion { get; set; }

		/// <summary>
		/// The communication address of the runtime component.
		/// </summary>
		public string RuntimeAddress { get; set; }

		/// <summary>
		/// The unique identifier for the currently running runtime instance.
		/// </summary>
		public Guid RuntimeId { get; set; }

		/// <summary>
		/// The file path under which the log of the runtime component is to be stored.
		/// </summary>
		public string RuntimeLogFilePath { get; set; }

		/// <summary>
		/// The URI scheme for SEB resources.
		/// </summary>
		public string SebUriScheme { get; set; }

		/// <summary>
		/// The URI scheme for secure SEB resources.
		/// </summary>
		public string SebUriSchemeSecure { get; set; }

		/// <summary>
		/// The server API as JSON string.
		/// </summary>
		public string ServerApi { get; set; }

		/// <summary>
		/// The connection token for a server.
		/// </summary>
		public string ServerConnectionToken { get; set; }

		/// <summary>
		/// The identifier of the selected server exam.
		/// </summary>
		public string ServerExamId { get; set; }

		/// <summary>
		/// The OAuth2 token for a server.
		/// </summary>
		public string ServerOauth2Token { get; set; }

		/// <summary>
		/// The communication address of the service component.
		/// </summary>
		public string ServiceAddress { get; set; }

		/// <summary>
		/// The name of the global inter-process synchronization event hosted by the service.
		/// </summary>
		public string ServiceEventName { get; set; }

		/// <summary>
		/// The file path under which the log for the current session of the service component is to be stored.
		/// </summary>
		public string ServiceLogFilePath { get; set; }

		/// <summary>
		/// The directory to be used for temporary application data.
		/// </summary>
		public string TemporaryDirectory { get; set; }

		/// <summary>
		/// Creates a shallow clone.
		/// </summary>
		public AppConfig Clone()
		{
			return MemberwiseClone() as AppConfig;
		}
	}
}