/*
// Copyright (c) 2019 Intel 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.
*/

#include <boost/asio.hpp>
#include <sdbusplus/asio/object_server.hpp>
#include <util.hpp>

/**
 * @class ColdRedundancy
 *
 */
class ColdRedundancy
{
  public:
    /**
     * Constructor
     *
     * @param[in] io - boost asio context
     * @param[in] objectServer - D-Bus object
     * @param[in] dbusConnection - D-Bus connection
     */
    ColdRedundancy(
        boost::asio::io_service& io,
        sdbusplus::asio::object_server& objectServer,
        std::shared_ptr<sdbusplus::asio::connection>& dbusConnection);

    /**
     * Checking PSU information, adding matches, starting rotation
     * and creating PSU objects
     *
     * @param[in] dbusConnection - D-Bus connection
     */
    void
        createPSU(std::shared_ptr<sdbusplus::asio::connection>& dbusConnection);

  private:
    /**
     * @brief Indicates the count of PSUs
     *
     * @details Indicates how many PSUs are there on the system.
     */
    uint8_t numberOfPSU = 0;

    /**
     * @brief Indicates the delay timer
     *
     * @details Each time this daemon start, need a delay to avoid
     *          different PSUs calling createPSU function for
     *          several times at same time
     */
    boost::asio::steady_timer filterTimer;

    /**
     * @brief Indicates the dbus connction
     */
    std::shared_ptr<sdbusplus::asio::connection>& systemBus;

    /**
     * @brief Indicates the D-Bus matches
     *
     * @details This matches contain all matches in this daemon such
     *          as PSU event match, PSU information match. The target
     *          D-Bus properties change will trigger callback function
     *          by these matches
     */
    std::vector<std::unique_ptr<sdbusplus::bus::match::match>> matches;
};

/**
 * @class PowerSupply
 * Represents a power supply device.
 */
class PowerSupply
{
  public:
    /**
     * Constructor
     *
     * @param[in] name - the device name
     * @param[in] bus - smbus number
     * @param[in] address - device address on smbus
     * @param[in] order - ranking order of redundancy
     * @param[in] dbusConnection - D-Bus connection
     */
    PowerSupply(
        std::string& name, uint8_t bus, uint8_t address, uint8_t order,
        const std::shared_ptr<sdbusplus::asio::connection>& dbusConnection);
    ~PowerSupply() = default;

    /**
     * @brief Indicates the name of the device
     *
     * @details The PSU name such as PSU1
     */
    std::string name;

    /**
     * @brief Indicates the smbus number
     *
     * @details The smbus number on the system
     */
    uint8_t bus;

    /**
     * @brief Indicates the smbus address of the device
     *
     * @details The 7-bit smbus address of the PSU on smbus
     */
    uint8_t address;

    /**
     * @brief Indicates the ranking order
     *
     * @details The order indicates the sequence entering standby mode.
     *          the PSU with lower order will enter standby mode first.
     */
    uint8_t order = 0;

    /**
     * @brief Indicates the status of the PSU
     *
     * @details If the PSU has no any problem, the status of it will be
     *          normal otherwise acLost.
     */
    CR::PSUState state = CR::PSUState::normal;
};
