/**
 * 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 "services.hpp"
#include "system.hpp"

#include <interfaces/manager_interface.hpp>
#include <sdbusplus/bus.hpp>
#include <sdbusplus/bus/match.hpp>
#include <sdbusplus/server/object.hpp>
#include <sdeventplus/event.hpp>
#include <sdeventplus/source/signal.hpp>
#include <sdeventplus/utility/timer.hpp>

#include <filesystem>
#include <memory>
#include <string>
#include <vector>

namespace phosphor::power::regulators
{

using Timer = sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>;

using ManagerObject = sdbusplus::server::object::object<
    phosphor::power::regulators::interface::ManagerInterface>;

class Manager : public ManagerObject
{
  public:
    Manager() = delete;
    Manager(const Manager&) = delete;
    Manager(Manager&&) = delete;
    Manager& operator=(const Manager&) = delete;
    Manager& operator=(Manager&&) = delete;
    ~Manager() = default;

    /**
     * Constructor
     * Creates a manager over the regulators.
     *
     * @param bus the D-Bus bus
     * @param event the sdevent event
     */
    Manager(sdbusplus::bus::bus& bus, const sdeventplus::Event& event);

    /**
     * Implements the D-Bus "configure" method.
     *
     * Configures all the voltage regulators in the system.
     *
     * This method should be called when the system is being powered on.  It
     * needs to occur before the regulators have been enabled/turned on.
     */
    void configure() override;

    /**
     * Callback function to handle interfacesAdded D-Bus signals
     *
     * @param msg Expanded sdbusplus message data
     */
    void interfacesAddedHandler(sdbusplus::message::message& msg);

    /**
     * Implements the D-Bus "monitor" method.
     *
     * Sets whether regulator monitoring is enabled.
     *
     * When monitoring is enabled:
     *   - regulator sensors will be read and published on D-Bus
     *   - phase fault detection will be performed
     *
     * Regulator monitoring should be enabled when the system is being powered
     * on.  It needs to occur after the regulators have been configured and
     * enabled/turned on.
     *
     * Regulator monitoring should be disabled when the system is being powered
     * off.  It needs to occur before the regulators have been disabled/turned
     * off.
     *
     * Regulator monitoring can also be temporarily disabled and then re-enabled
     * while the system is powered on.  This allows other applications or tools
     * to temporarily communicate with the regulators for testing or debug.
     * Monitoring should be disabled for only short periods of time; other
     * applications, such as fan control, may be dependent on regulator sensors.
     *
     * @param enable true if monitoring should be enabled, false if it should be
     *               disabled
     */
    void monitor(bool enable) override;

    /**
     * Phase fault detection timer expired callback function.
     */
    void phaseFaultTimerExpired();

    /**
     * Sensor monitoring timer expired callback function.
     */
    void sensorTimerExpired();

    /**
     * Callback function to handle receiving a HUP signal
     * to reload the configuration data.
     *
     * @param sigSrc sd_event_source signal wrapper
     * @param sigInfo signal info on signal fd
     */
    void sighupHandler(sdeventplus::source::Signal& sigSrc,
                       const struct signalfd_siginfo* sigInfo);

  private:
    /**
     * Clear any cached data or error history related to hardware devices.
     *
     * This method should be called when the system is powering on (booting).
     * While the system was powered off, hardware could have been added,
     * removed, or replaced.
     */
    void clearHardwareData();

    /**
     * Finds the list of compatible system types using D-Bus methods.
     *
     * This list is used to find the correct JSON configuration file for the
     * current system.
     *
     * Note that some systems do not support the D-Bus compatible interface.
     *
     * If a list of compatible system types is found, it is stored in the
     * compatibleSystemTypes data member.
     */
    void findCompatibleSystemTypes();

    /**
     * Finds the JSON configuration file.
     *
     * Looks for a configuration file based on the list of compatible system
     * types.  If no file is found, looks for a file with the default name.
     *
     * Looks for the file in the test directory and standard directory.
     *
     * Throws an exception if an operating system error occurs while checking
     * for the existence of a file.
     *
     * @return absolute path to config file, or an empty path if none found
     */
    std::filesystem::path findConfigFile();

    /**
     * Returns whether the JSON configuration file has been loaded.
     *
     * @return true if config file loaded, false otherwise
     */
    bool isConfigFileLoaded() const
    {
        // If System object exists, the config file has been loaded
        return (system != nullptr);
    }

    /**
     * Returns whether the system is currently powered on.
     *
     * @return true if system is powered on, false otherwise
     */
    bool isSystemPoweredOn();

    /**
     * Loads the JSON configuration file.
     *
     * Looks for the config file using findConfigFile().
     *
     * If the config file is found, it is parsed and the resulting information
     * is stored in the system data member.  If parsing fails, an error is
     * logged.
     */
    void loadConfigFile();

    /**
     * Waits until the JSON configuration file has been loaded.
     *
     * If the config file has not yet been loaded, waits until one of the
     * following occurs:
     * - config file is loaded
     * - maximum amount of time to wait has elapsed
     */
    void waitUntilConfigFileLoaded();

    /**
     * The D-Bus bus
     */
    sdbusplus::bus::bus& bus;

    /**
     * Event to loop on
     */
    const sdeventplus::Event& eventLoop;

    /**
     * System services like error logging and the journal.
     */
    BMCServices services;

    /**
     * Event timer used to initiate phase fault detection.
     */
    Timer phaseFaultTimer;

    /**
     * Event timer used to initiate sensor monitoring.
     */
    Timer sensorTimer;

    /**
     * List of D-Bus signal matches
     */
    std::vector<std::unique_ptr<sdbusplus::bus::match::match>> signals{};

    /**
     * Indicates whether regulator monitoring is enabled.
     */
    bool isMonitoringEnabled{false};

    /**
     * List of compatible system types for the current system.
     *
     * Used to find the JSON configuration file.
     */
    std::vector<std::string> compatibleSystemTypes{};

    /**
     * Computer system being controlled and monitored by the BMC.
     *
     * Contains the information loaded from the JSON configuration file.
     * Contains nullptr if the configuration file has not been loaded.
     */
    std::unique_ptr<System> system{};
};

} // namespace phosphor::power::regulators
