/*
 * Copyright (c) 2023 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.Collections.Generic;
using SafeExamBrowser.SystemComponents.Contracts.Registry.Events;

namespace SafeExamBrowser.SystemComponents.Contracts.Registry
{
	/// <summary>
	/// Provides functionality related to the Windows registry.
	/// </summary>
	public interface IRegistry
	{
		/// <summary>
		/// Fired when a registry value previously registred via <see cref="StartMonitoring(string, string)"/> has changed.
		/// </summary>
		event RegistryValueChangedEventHandler ValueChanged;

		/// <summary>
		/// Starts monitoring the specified registry value.
		/// </summary>
		void StartMonitoring(string key, string name);

		/// <summary>
		/// Stops the monitoring of all previously registered registry values.
		/// </summary>
		void StopMonitoring();

		/// <summary>
		/// Stops the monitoring of the specified registry value.
		/// </summary>
		void StopMonitoring(string key, string name);

		/// <summary>
		/// Attempts to read the value of the given name under the specified registry key.
		/// </summary>
		bool TryRead(string key, string name, out object value);

		/// <summary>
		/// Attempts to read the value names of the given registry key.
		/// </summary>
		bool TryGetNames(string key, out IEnumerable<string> names);

		/// <summary>
		/// Attempts to read the subkey names of the given registry key.
		/// </summary>
		bool TryGetSubKeys(string key, out IEnumerable<string> subKeys);
	}
}