/*
// Copyright (c) 2021 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.
*/
#pragma once
#include <systemd/sd-journal.h>

#include <error_monitors/base_monitor.hpp>
#include <gpiod.hpp>
#include <host_error_monitor.hpp>
#include <sdbusplus/asio/object_server.hpp>

#include <iostream>

namespace host_error_monitor::cpu_mismatch_monitor
{
static constexpr bool debug = false;

class CPUMismatchMonitor : public host_error_monitor::base_monitor::BaseMonitor
{
    size_t cpuNum;
    gpiod::line cpuMismatchLine;

    void cpuMismatchLog()
    {
        sd_journal_send("MESSAGE=HostError: CPU %d mismatch", cpuNum,
                        "PRIORITY=%i", LOG_ERR, "REDFISH_MESSAGE_ID=%s",
                        "OpenBMC.0.1.CPUMismatch", "REDFISH_MESSAGE_ARGS=%d",
                        cpuNum, NULL);
    }

    bool requestCPUMismatchInput()
    {
        // Find the GPIO line
        cpuMismatchLine = gpiod::find_line(signalName);
        if (!cpuMismatchLine)
        {
            std::cerr << "Failed to find the " << signalName << " line.\n";
            return false;
        }

        // Request GPIO input
        try
        {
            cpuMismatchLine.request(
                {"host-error-monitor", gpiod::line_request::DIRECTION_INPUT});
        }
        catch (std::exception&)
        {
            std::cerr << "Failed to request " << signalName << " input\n";
            return false;
        }

        return true;
    }

    bool cpuMismatchAsserted()
    {
        if constexpr (debug)
        {
            std::cerr << "Checking " << signalName << " state\n";
        }

        return (cpuMismatchLine.get_value() == 1);
    }

    void cpuMismatchAssertHandler()
    {
        std::cerr << signalName << " asserted\n";
        cpuMismatchLog();
    }

    void checkCPUMismatch()
    {
        if (cpuMismatchAsserted())
        {
            cpuMismatchAssertHandler();
        }
    }

  public:
    CPUMismatchMonitor(boost::asio::io_service& io,
                       std::shared_ptr<sdbusplus::asio::connection> conn,
                       const std::string& signalName, const size_t cpuNum) :
        BaseMonitor(io, conn, signalName),
        cpuNum(cpuNum)
    {
        // Request GPIO input
        if (!requestCPUMismatchInput())
        {
            return;
        }
        checkCPUMismatch();
        valid = true;
    }

    void hostOn() override
    {
        checkCPUMismatch();
    }
};
} // namespace host_error_monitor::cpu_mismatch_monitor
