/**
 * Copyright © 2017 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.
 */

#include <algorithm>
#include <map>
#include <string>
#include "util.hpp"

using namespace std::literals::string_literals;

template <typename T>
struct BusMeetsMSL
{
    std::string path;

    BusMeetsMSL(const std::string& p)
        :path(p) {}

    auto operator()(const T& arg)
    {
        // Query each service hosting
        // xyz.openbmc_project.Inventory.Decorator.MeetsMinimumShipLevel.

        const auto& busName = arg.first;
        return util::sdbusplus::getProperty<bool>(
                busName,
                path,
                "xyz.openbmc_project.Inventory."
                    "Decorator.MeetsMinimumShipLevel"s,
                "MeetsMinimumShipLevel"s);
    }
};

template <typename T>
struct PathMeetsMSL
{
    auto operator()(const T& arg)
    {
        // A given path in the mapper response is composed of
        // a map of services/interfaces.  Validate each service
        // that hosts the MSL interface meets the MSL.

        const auto& path = arg.first;
        return std::all_of(
                arg.second.begin(),
                arg.second.end(),
                BusMeetsMSL<typename decltype(arg.second)::value_type>(path));
    }
};

int main(void)
{
    auto mslVerificationRequired =
        util::sdbusplus::getProperty<bool>(
                "/xyz/openbmc_project/control/minimum_ship_level_required"s,
                "xyz.openbmc_project.Control.MinimumShipLevel"s,
                "MinimumShipLevelRequired"s);

    if (!mslVerificationRequired)
    {
        return 0;
    }

    // Obtain references to all objects hosting
    // xyz.openbmc_project.Inventory.Decorator.MeetsMinimumShipLevel
    // with a mapper subtree query.  For each object, validate that
    // the minimum ship level has been met.

    using SubTreeType =
        std::map<
            std::string,
            std::map<std::string, std::vector<std::string>>>;

    auto subtree =
        util::sdbusplus::callMethodAndRead<SubTreeType>(
                "xyz.openbmc_project.ObjectMapper"s,
                "/xyz/openbmc_project/object_mapper"s,
                "xyz.openbmc_project.ObjectMapper"s,
                "GetSubTree"s,
                "/"s,
                0,
                std::vector<std::string>{
                    "xyz.openbmc_project.Inventory"
                        ".Decorator.MeetsMinimumShipLevel"s});

    auto result = std::all_of(
            subtree.begin(),
            subtree.end(),
            PathMeetsMSL<SubTreeType::value_type>());

    if (!result)
    {
        phosphor::logging::log<phosphor::logging::level::INFO>(
                "The physical system configuration does not "
                "satisfy the minimum ship level.");

        return 1;
    }

    return 0;
}
