/**
 * Copyright © 2020 IBM Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#pragma once

#include "action.hpp"
#include "error_history.hpp"
#include "services.hpp"

#include <memory>
#include <utility>
#include <vector>

namespace phosphor::power::regulators
{

// Forward declarations to avoid circular dependencies
class Chassis;
class Device;
class Rail;
class System;

/**
 * @class SensorMonitoring
 *
 * Defines how to read the sensors for a voltage rail, such as voltage output,
 * current output, and temperature.
 *
 * Sensor values are measured, actual values rather than target values.
 *
 * Sensors are read once per second.  The sensor values are stored on D-Bus,
 * making them available to external interfaces like Redfish.
 *
 * Sensors are read by executing actions, such as PMBusReadSensorAction.  To
 * read multiple sensors for a rail, multiple actions need to be executed.
 */
class SensorMonitoring
{
  public:
    // Specify which compiler-generated methods we want
    SensorMonitoring() = delete;
    SensorMonitoring(const SensorMonitoring&) = delete;
    SensorMonitoring(SensorMonitoring&&) = delete;
    SensorMonitoring& operator=(const SensorMonitoring&) = delete;
    SensorMonitoring& operator=(SensorMonitoring&&) = delete;
    ~SensorMonitoring() = default;

    /**
     * Constructor.
     *
     * @param actions actions that read the sensors for a rail
     */
    explicit SensorMonitoring(std::vector<std::unique_ptr<Action>> actions) :
        actions{std::move(actions)}
    {
    }

    /**
     * Clears all error history.
     *
     * All data on previously logged errors will be deleted.  If errors occur
     * again in the future they will be logged again.
     *
     * This method is normally called when the system is being powered on.
     */
    void clearErrorHistory()
    {
        errorHistory.clear();
        errorCount = 0;
    }

    /**
     * Executes the actions to read the sensors for a rail.
     *
     * @param services system services like error logging and the journal
     * @param system system that contains the chassis
     * @param chassis chassis that contains the device
     * @param device device that contains the rail
     * @param rail rail associated with the sensors
     */
    void execute(Services& services, System& system, Chassis& chassis,
                 Device& device, Rail& rail);

    /**
     * Returns the actions that read the sensors for a rail.
     *
     * @return actions
     */
    const std::vector<std::unique_ptr<Action>>& getActions() const
    {
        return actions;
    }

  private:
    /**
     * Actions that read the sensors for a rail.
     */
    std::vector<std::unique_ptr<Action>> actions{};

    /**
     * History of which error types have been logged.
     *
     * Since sensor monitoring runs repeatedly based on a timer, each error type
     * is only logged once.
     */
    ErrorHistory errorHistory{};

    /**
     * Number of errors that have occurred.
     */
    unsigned int errorCount{0};
};

} // namespace phosphor::power::regulators
