dorisoy_HardwareMonitor/LibreHardwareMonitorLib/Hardware/IComputer.cs
// 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/.
// Copyright (C) LibreHardwareMonitor and Contributors.
// Partial Copyright (C) Michael Möller <mmoeller@openhardwaremonitor.org> and Contributors.
// All Rights Reserved.

using System.Collections.Generic;

namespace LibreHardwareMonitor.Hardware
{
    /// <summary>
    /// Handler that will trigger the actions assigned to it when the event occurs.
    /// </summary>
    /// <param name="hardware">Component returned to the assigned action(s).</param>
    public delegate void HardwareEventHandler(IHardware hardware);

    /// <summary>
    /// Basic abstract with methods for the class which can store all hardware and decides which devices are to be checked and updated.
    /// </summary>
    public interface IComputer : IElement
    {
        /// <summary>
        /// Gets or sets a value indicating whether collecting information about <see cref="HardwareType.Cpu"/> devices should be enabled and updated.
        /// </summary>
        /// <returns><see langword="true"/> if a given category of devices is already enabled.</returns>
        bool IsCpuEnabled { get; }

        /// <summary>
        /// Gets or sets a value indicating whether collecting information about:
        /// <list>
        /// <item><see cref="LibreHardwareMonitor.Hardware.Controller.TBalancer.TBalancerGroup"/></item>
        /// <item><see cref="LibreHardwareMonitor.Hardware.Controller.Heatmaster.HeatmasterGroup"/></item>
        /// <item><see cref="LibreHardwareMonitor.Hardware.Controller.AquaComputer.AquaComputerGroup"/></item>
        /// <item><see cref="LibreHardwareMonitor.Hardware.Controller.AeroCool.AeroCoolGroup"/></item>
        /// <item><see cref="LibreHardwareMonitor.Hardware.Controller.Nzxt.NzxtGroup"/></item>
        /// </list>
        /// devices should be enabled and updated.
        /// </summary>
        /// <returns><see langword="true"/> if a given category of devices is already enabled.</returns>
        bool IsControllerEnabled { get; }

        /// <summary>
        /// Gets or sets a value indicating whether collecting information about <see cref="HardwareType.GpuAmd"/> or <see cref="HardwareType.GpuNvidia"/> devices should be enabled and updated.
        /// </summary>
        /// <returns><see langword="true"/> if a given category of devices is already enabled.</returns>
        bool IsGpuEnabled { get; }

        /// <summary>
        /// Gets or sets a value indicating whether collecting information about <see cref="HardwareType.Storage"/> devices should be enabled and updated.
        /// </summary>
        /// <returns><see langword="true"/> if a given category of devices is already enabled.</returns>
        bool IsStorageEnabled { get; }

        /// <summary>
        /// Gets or sets a value indicating whether collecting information about <see cref="HardwareType.Motherboard"/> devices should be enabled and updated.
        /// </summary>
        /// <returns><see langword="true"/> if a given category of devices is already enabled.</returns>
        bool IsMotherboardEnabled { get; }

        /// <summary>
        /// Gets or sets a value indicating whether collecting information about <see cref="HardwareType.Network"/> devices should be enabled and updated.
        /// </summary>
        /// <returns><see langword="true"/> if a given category of devices is already enabled.</returns>
        bool IsNetworkEnabled { get; }

        /// <summary>
        /// Gets or sets a value indicating whether collecting information about <see cref="HardwareType.Memory"/> devices should be enabled and updated.
        /// </summary>
        /// <returns><see langword="true"/> if a given category of devices is already enabled.</returns>
        bool IsMemoryEnabled { get; }

        /// <summary>
        /// Gets or sets a value indicating whether collecting information about <see cref="HardwareType.Psu"/> devices should be enabled and updated.
        /// </summary>
        /// <returns><see langword="true"/> if a given category of devices is already enabled.</returns>
        bool IsPsuEnabled { get; }

        /// <summary>
        /// Gets a list of all known <see cref="IHardware"/>.
        /// <para>Can be updated by <see cref="IVisitor"/>.</para>
        /// </summary>
        /// <returns>List of all enabled devices.</returns>
        IList<IHardware> Hardware { get; }

        /// <summary>
        /// Triggered when a new <see cref="IHardware"/> is registered.
        /// </summary>
        event HardwareEventHandler HardwareAdded;

        /// <summary>
        /// Triggered when a <see cref="IHardware"/> is removed.
        /// </summary>
        event HardwareEventHandler HardwareRemoved;

        /// <summary>
        /// Generates full LibreHardwareMonitor report for devices that have been enabled.
        /// </summary>
        /// <returns>A formatted text string with library, OS and hardware information.</returns>
        string GetReport();
    }
}
