/**
 * Copyright © 2019 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 "configuration.hpp"
#include "i2c_interface.hpp"
#include "id_map.hpp"
#include "phase_fault_detection.hpp"
#include "presence_detection.hpp"
#include "rail.hpp"
#include "services.hpp"

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

namespace phosphor::power::regulators
{

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

/**
 * @class Device
 *
 * A hardware device, such as a voltage regulator or I/O expander.
 */
class Device
{
  public:
    // Specify which compiler-generated methods we want
    Device() = delete;
    Device(const Device&) = delete;
    Device(Device&&) = delete;
    Device& operator=(const Device&) = delete;
    Device& operator=(Device&&) = delete;
    ~Device() = default;

    /**
     * Constructor.
     *
     * @param id unique device ID
     * @param isRegulator indicates whether this device is a voltage regulator
     * @param fru Field-Replaceable Unit (FRU) for this device
     * @param i2cInterface I2C interface to this device
     * @param presenceDetection presence detection for this device, if any
     * @param configuration configuration changes to apply to this device, if
     *                      any
     * @param phaseFaultDetection phase fault detection for this device, if any
     * @param rails voltage rails produced by this device, if any
     */
    explicit Device(
        const std::string& id, bool isRegulator, const std::string& fru,
        std::unique_ptr<i2c::I2CInterface> i2cInterface,
        std::unique_ptr<PresenceDetection> presenceDetection = nullptr,
        std::unique_ptr<Configuration> configuration = nullptr,
        std::unique_ptr<PhaseFaultDetection> phaseFaultDetection = nullptr,
        std::vector<std::unique_ptr<Rail>> rails =
            std::vector<std::unique_ptr<Rail>>{}) :
        id{id},
        isRegulatorDevice{isRegulator}, fru{fru},
        i2cInterface{std::move(i2cInterface)}, presenceDetection{std::move(
                                                   presenceDetection)},
        configuration{std::move(configuration)},
        phaseFaultDetection{std::move(phaseFaultDetection)}, rails{std::move(
                                                                 rails)}
    {}

    /**
     * Adds this Device object to the specified IDMap.
     *
     * Also adds any Rail objects in this Device to the IDMap.
     *
     * @param idMap mapping from IDs to the associated Device/Rail/Rule objects
     */
    void addToIDMap(IDMap& idMap);

    /**
     * Clear any cached data about hardware devices.
     */
    void clearCache();

    /**
     * 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();

    /**
     * Closes this device.
     *
     * Closes any interfaces that are open to this device.  Releases any other
     * operating system resources associated with this device.
     *
     * @param services system services like error logging and the journal
     */
    void close(Services& services);

    /**
     * Configure this device.
     *
     * Applies the configuration changes that are defined for this device, if
     * any.
     *
     * Also configures the voltage rails produced by this device, if any.
     *
     * This method should be called during the boot before regulators are
     * enabled.
     *
     * @param services system services like error logging and the journal
     * @param system system that contains the chassis
     * @param chassis chassis that contains this device
     */
    void configure(Services& services, System& system, Chassis& chassis);

    /**
     * Detect redundant phase faults in this device.
     *
     * Does nothing if phase fault detection is not defined for this device.
     *
     * This method should be called repeatedly based on a timer.
     *
     * @param services system services like error logging and the journal
     * @param system system that contains the chassis
     * @param chassis chassis that contains the device
     */
    void detectPhaseFaults(Services& services, System& system,
                           Chassis& chassis);

    /**
     * Returns the configuration changes to apply to this device, if any.
     *
     * @return Pointer to Configuration object.  Will equal nullptr if no
     *         configuration changes are defined for this device.
     */
    const std::unique_ptr<Configuration>& getConfiguration() const
    {
        return configuration;
    }

    /**
     * Returns the Field-Replaceable Unit (FRU) for this device.
     *
     * Returns the D-Bus inventory path of the FRU.  If the device itself is not
     * a FRU, returns the FRU that contains the device.
     *
     * @return FRU for this device
     */
    const std::string& getFRU() const
    {
        return fru;
    }

    /**
     * Returns the I2C interface to this device.
     *
     * @return I2C interface to device
     */
    i2c::I2CInterface& getI2CInterface()
    {
        return *i2cInterface;
    }

    /**
     * Returns the unique ID of this device.
     *
     * @return device ID
     */
    const std::string& getID() const
    {
        return id;
    }

    /**
     * Returns the phase fault detection for this device, if any.
     *
     * @return Pointer to PhaseFaultDetection object.  Will equal nullptr if no
     *         phase fault detection is defined for this device.
     */
    const std::unique_ptr<PhaseFaultDetection>& getPhaseFaultDetection() const
    {
        return phaseFaultDetection;
    }

    /**
     * Returns the presence detection for this device, if any.
     *
     * @return Pointer to PresenceDetection object.  Will equal nullptr if no
     *         presence detection is defined for this device.
     */
    const std::unique_ptr<PresenceDetection>& getPresenceDetection() const
    {
        return presenceDetection;
    }

    /**
     * Returns the voltage rails produced by this device, if any.
     *
     * @return voltage rails
     */
    const std::vector<std::unique_ptr<Rail>>& getRails() const
    {
        return rails;
    }

    /**
     * Returns whether this device is present.
     *
     * @return true if device is present, false otherwise
     */
    bool isPresent(Services& services, System& system, Chassis& chassis)
    {
        if (presenceDetection)
        {
            // Execute presence detection to determine if device is present
            return presenceDetection->execute(services, system, chassis, *this);
        }
        else
        {
            // No presence detection defined; assume device is present
            return true;
        }
    }

    /**
     * Returns whether this device is a voltage regulator.
     *
     * @return true if device is a voltage regulator, false otherwise
     */
    bool isRegulator() const
    {
        return isRegulatorDevice;
    }

    /**
     * Monitors the sensors for the voltage rails produced by this device, if
     * any.
     *
     * This method should be called repeatedly based on a timer.
     *
     * @param services system services like error logging and the journal
     * @param system system that contains the chassis
     * @param chassis chassis that contains the device
     */
    void monitorSensors(Services& services, System& system, Chassis& chassis);

  private:
    /**
     * Unique ID of this device.
     */
    const std::string id{};

    /**
     * Indicates whether this device is a voltage regulator.
     */
    const bool isRegulatorDevice{false};

    /**
     * Field-Replaceable Unit (FRU) for this device.
     *
     * Set to the D-Bus inventory path of the FRU.  If the device itself is not
     * a FRU, set to the FRU that contains the device.
     */
    const std::string fru{};

    /**
     * I2C interface to this device.
     */
    std::unique_ptr<i2c::I2CInterface> i2cInterface{};

    /**
     * Presence detection for this device, if any.  Set to nullptr if no
     * presence detection is defined for this device.
     */
    std::unique_ptr<PresenceDetection> presenceDetection{};

    /**
     * Configuration changes to apply to this device, if any.  Set to nullptr if
     * no configuration changes are defined for this device.
     */
    std::unique_ptr<Configuration> configuration{};

    /**
     * Phase fault detection for this device, if any.  Set to nullptr if no
     * phase fault detection is defined for this device.
     */
    std::unique_ptr<PhaseFaultDetection> phaseFaultDetection{};

    /**
     * Voltage rails produced by this device, if any.  Vector is empty if no
     * voltage rails are defined for this device.
     */
    std::vector<std::unique_ptr<Rail>> rails{};
};

} // namespace phosphor::power::regulators
