// Copyright 2024 Google LLC
//
// 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 "hoth_dbus.hpp"

#include "google3/ec_commands.h"
#include "google3/host_commands.h"

#include "message_util.hpp"
#include "payload_update.hpp"
#include "payload_update_common.hpp"

#include <boost/endian/conversion.hpp>
#include <sdbusplus/bus.hpp>
#include <sdbusplus/message.hpp>
#include <stdplus/raw.hpp>
#include <xyz/openbmc_project/Control/Hoth/server.hpp>

#include <chrono>
#include <cstdlib>
#include <cstring>
#include <exception>
#include <functional>
#include <iostream>
#include <span>
#include <string>
#include <thread>
#include <utility>
#include <vector>

namespace google::hoth::tools
{
using FirmwareUpdateStatus = sdbusplus::xyz::openbmc_project::Control::server::
    Hoth::FirmwareUpdateStatus;
constexpr uint8_t kStructVersion =
    google::hoth::internal::SUPPORTED_STRUCT_VERSION;
constexpr uint32_t kSectorSizeBytes = 4096;
constexpr uint32_t kEraseChunkSizeBytes = kSectorSizeBytes * 32;
using namespace std::chrono_literals;
constexpr sdbusplus::SdBusDuration kCommandTimeout = 60s;
constexpr char kHothInterface[] = "xyz.openbmc_project.Control.Hoth";
constexpr char kHothObject[] = "/xyz/openbmc_project/Control/Hoth";

template <typename... Vargs>
sdbusplus::message::message HothDBus::callMethod(
    const char* method, const std::string& hothId, Vargs&&... vargs)
{
    std::string service{kHothInterface};
    std::string object{kHothObject};
    if (!hothId.empty())
    {
        service += ".";
        service += hothId;
        object += "/";
        object += hothId;
    }
    sdbusplus::message::message msg = dbus.new_method_call(
        service.c_str(), object.c_str(), kHothInterface, method);
    msg.append(std::forward<Vargs>(vargs)...);
    return dbus.call(msg, kCommandTimeout);
}

template <typename T, typename... Vargs>
void HothDBus::callMethodAndRead(const char* method, const std::string& hothId,
                                 T& value, Vargs&&... vargs)
{
    sdbusplus::message::message reply =
        callMethod(method, hothId, std::forward<Vargs>(vargs)...);
    reply.read(value);
}

FirmwareUpdateStatus HothDBus::getVerifyPayloadStatus(const std::string& hothId)
{
    std::string response;
    callMethodAndRead("GetVerifyPayloadStatus", hothId, response);
    return sdbusplus::xyz::openbmc_project::Control::server::Hoth::
        convertFirmwareUpdateStatusFromString(response);
}

FirmwareUpdateStatus HothDBus::getSendPayloadStatus(const std::string& hothId)
{
    std::string response;
    callMethodAndRead("GetSendPayloadStatus", hothId, response);
    return sdbusplus::xyz::openbmc_project::Control::server::Hoth::
        convertFirmwareUpdateStatusFromString(response);
}

bool HothDBus::verifyPayload(const std::string& hothId)
{
    callMethod("VerifyPayload", hothId);
    auto timeout = std::chrono::steady_clock::now() + 10s;

    FirmwareUpdateStatus status = getVerifyPayloadStatus(hothId);
    while (status == FirmwareUpdateStatus::InProgress)
    {
        if (std::chrono::steady_clock::now() > timeout)
        {
            std::cerr << "Verify payload timed out." << '\n';
            return false;
        }
        std::this_thread::sleep_for(100ms);
        status = getVerifyPayloadStatus(hothId);
    }
    if (status != FirmwareUpdateStatus::Done)
    {
        std::cerr << "Verify payload failed." << '\n';
        return false;
    }
    return true;
}

std::optional<std::string> HothDBus::getPayloadVersion(
    const std::string& hothId, payload_update::VersionType type)
{
    google::hoth::internal::ReqHeader req;
    memset(&req, 0, sizeof(req));
    req.struct_version = kStructVersion;
    req.command = EC_CMD_BOARD_SPECIFIC_BASE | EC_PRV_CMD_HOTH_PAYLOAD_STATUS;
    using google::hoth::internal::calculateChecksum;
    auto spanReq = stdplus::raw::asSpan<uint8_t>(req);
    uint8_t checksumNegated = calculateChecksum(spanReq);
    req.checksum = ~checksumNegated + 1;
    std::vector<uint8_t> bytes;
    callMethodAndRead("SendHostCommand", hothId, bytes, spanReq);
    if (bytes.size() < sizeof(PayloadVersionResponse))
    {
        std::cerr << "Invalid response." << '\n';
        return {};
    }
    auto response = stdplus::raw::copyFrom<PayloadVersionResponse>(bytes);
    if (response.header.struct_version != kStructVersion)
    {
        std::cerr << "Response structure version not supported: "
                  << response.header.struct_version << '\n';
        return {};
    }
    if (response.header.result != 0)
    {
        std::cerr << "Failed to get payload version" << '\n';
        return {};
    }
    const uint8_t activeHalf = response.status.header.active_half;
    const uint8_t regionCount = response.status.header.region_count;
    if (regionCount == 0 || regionCount > PAYLOAD_STATUS_MAX_REGION_STATES)
    {
        std::cerr << "Payload status region count invalid." << '\n';
        return {};
    }
    std::string versionStrings[PAYLOAD_STATUS_MAX_REGION_STATES];
    for (uint8_t i = 0; i < regionCount; i++)
    {
        const payload_region_state& region = response.status.states[i];
        if (region.validation_state == PAYLOAD_IMAGE_VALID ||
            region.validation_state == PAYLOAD_DESCRIPTOR_VALID)
        {
            versionStrings[i] = std::to_string(region.version_major) + "." +
                                std::to_string(region.version_minor) + "." +
                                std::to_string(region.version_point) + "." +
                                std::to_string(region.version_subpoint);
        }
        else
        {
            versionStrings[i] = "";
        }
    }
    std::cerr << "Active half: " << static_cast<unsigned int>(activeHalf)
              << '\n';
    std::cerr << "Version[0]:  " << versionStrings[0] << '\n';
    std::cerr << "Version[1]:  " << versionStrings[1] << '\n';
    if (type == payload_update::VersionType::kActiveHalf)
    {
        return versionStrings[activeHalf];
    }
    return versionStrings[1 - activeHalf];
}

bool HothDBus::sendPayloadAndVerify(const std::string& hothId,
                                    const std::string& payloadFile)
{
    std::cerr << hothId << ": Sending payload" << '\n';
    callMethod("SendPayload", hothId, payloadFile);
    auto timeout = std::chrono::steady_clock::now() + 10min;
    FirmwareUpdateStatus status = getSendPayloadStatus(hothId);
    while (status == FirmwareUpdateStatus::InProgress)
    {
        if (std::chrono::steady_clock::now() > timeout)
        {
            std::cerr << "Send payload timed out." << '\n';
            return false;
        }
        std::this_thread::sleep_for(1s);
        status = getSendPayloadStatus(hothId);
    }
    if (status != FirmwareUpdateStatus::Done)
    {
        std::cerr << "Send payload failed." << '\n';
        return false;
    }
    return verifyPayload(hothId);
}

bool HothDBus::sendStaticWPPayloadAndVerify(const std::string& hothId,
                                            const std::string& payloadFile)
{
    std::cerr << hothId << ": Erasing & Sending Static & WP" << '\n';
    callMethod("EraseAndSendStaticWPPayload", hothId, payloadFile);
    auto timeout = std::chrono::steady_clock::now() + 10min;
    FirmwareUpdateStatus status = getSendPayloadStatus(hothId);
    while (status == FirmwareUpdateStatus::InProgress)
    {
        if (std::chrono::steady_clock::now() > timeout)
        {
            std::cerr << "Send payload timed out." << '\n';
            return false;
        }
        std::this_thread::sleep_for(1s);
        status = getSendPayloadStatus(hothId);
    }
    if (status != FirmwareUpdateStatus::Done)
    {
        std::cerr << "Send payload failed." << '\n';
        return false;
    }
    return verifyPayload(hothId);
}

bool HothDBus::activatePayload(const std::string& hothId)
{
    sdbusplus::message::message msg =
        callMethod("ActivatePayload", hothId, true);
    if (msg.is_method_error())
    {
        const sd_bus_error* err = msg.get_error();
        const std::string name(err->name);
        const std::string message(err->message);
        std::cerr << "Activate payload error. " << name << ": " << message
                  << '\n';
        return false;
    }
    return true;
}

bool HothDBus::deactivatePayload(const std::string& hothId)
{
    sdbusplus::message::message msg =
        callMethod("DeactivatePayload", hothId, true);
    if (msg.is_method_error())
    {
        const sd_bus_error* err = msg.get_error();
        const std::string name(err->name);
        const std::string message(err->message);
        std::cerr << "Activate payload error. " << name << ": " << message
                  << '\n';
        return false;
    }
    return true;
}

bool HothDBus::confirmPayload(const std::string& hothId)
{
    // Need to make sure the ipmi system tool is working before confirming
    // NOLINTNEXTLINE(cert-env33-c)
    int ret = system("ipmitool mc info");
    if (ret)
    {
        std::cerr << "ipmitool not working. Error code: " << ret << ". Aborted."
                  << '\n';
        return false;
    }
    sdbusplus::message::message msg = callMethod("Confirm", hothId);
    if (msg.is_method_error())
    {
        const sd_bus_error* err = msg.get_error();
        const std::string name(err->name);
        const std::string message(err->message);
        std::cerr << "Confirm payload error. " << name << ": " << message
                  << '\n';
        return false;
    }
    return true;
}

bool HothDBus::eraseStagingArea(const std::string& hothId)
{
    uint32_t toEraseSize;
    callMethodAndRead("GetPayloadSize", hothId, toEraseSize);
    std::cerr << hothId << ": Erasing staging area" << '\n';
    if (toEraseSize == 0 || (toEraseSize % kSectorSizeBytes) != 0)
    {
        std::cerr << "Invalid staging area size" << '\n';
        return false;
    }
    uint32_t offset = 0;
    while (toEraseSize >= kEraseChunkSizeBytes)
    {
        callMethod("ErasePayload", hothId, offset, kEraseChunkSizeBytes);
        offset += kEraseChunkSizeBytes;
        toEraseSize -= kEraseChunkSizeBytes;
    }
    if (toEraseSize > 0)
    {
        callMethod("ErasePayload", hothId, offset, toEraseSize);
    }
    return true;
}

bool HothDBus::setTargetResetOption(const std::string& hothId,
                                    ec_target_reset_option option)
{
    TargetResetRequest req;
    memset(&req, 0, sizeof(req));
    req.header.struct_version = kStructVersion;
    req.header.command = EC_CMD_BOARD_SPECIFIC_BASE |
                         EC_PRV_CMD_HOTH_RESET_TARGET;
    req.header.data_len = sizeof(req.request);
    req.request.reset_option = option;
    using google::hoth::internal::calculateChecksum;
    auto spanReq = stdplus::raw::asSpan<uint8_t>(req);
    uint8_t checksumNegated = calculateChecksum(spanReq);
    req.header.checksum = ~checksumNegated + 1;
    if (option == EC_TARGET_RESET_OPTION_SET)
    {
        std::cerr << hothId << ": Put target in reset" << '\n';
    }
    else
    {
        std::cerr << hothId << ": Release target from reset" << '\n';
    }
    std::vector<uint8_t> bytes;
    callMethodAndRead("SendHostCommand", hothId, bytes, spanReq);
    using google::hoth::internal::RspHeader;
    auto response = stdplus::raw::copyFrom<RspHeader>(bytes);
    if (response.struct_version != kStructVersion)
    {
        std::cerr << "Response structure version not supported: "
                  << response.struct_version << '\n';
        return false;
    }
    if (response.result != 0)
    {
        std::cerr << "Failed to issue reset command" << '\n';
        return false;
    }

    return true;
}

bool HothDBus::setSpsPassthrough(const std::string& hothId, const bool enable)
{
    using google::hoth::internal::ReqHeader;
    using google::hoth::internal::RspHeader;

    ReqHeader req;
    memset(&req, 0, sizeof(req));
    req.struct_version = kStructVersion;
    if (enable)
    {
        req.command = EC_CMD_BOARD_SPECIFIC_BASE |
                      EC_PRV_CMD_HOTH_SPS_PASSTHROUGH_ENABLE;
        std::cerr << hothId << ": Enable SPS passthrough" << '\n';
    }
    else
    {
        req.command = EC_CMD_BOARD_SPECIFIC_BASE |
                      EC_PRV_CMD_HOTH_SPS_PASSTHROUGH_DISABLE;
        std::cerr << hothId << ": Disable SPS passthrough" << '\n';
    }
    using google::hoth::internal::calculateChecksum;
    auto spanReq = stdplus::raw::asSpan<uint8_t>(req);
    uint8_t checksumNegated = calculateChecksum(spanReq);
    req.checksum = ~checksumNegated + 1;
    std::vector<uint8_t> bytes;
    callMethodAndRead("SendHostCommand", hothId, bytes, spanReq);
    auto response = stdplus::raw::copyFrom<RspHeader>(bytes);
    if (response.struct_version != kStructVersion)
    {
        std::cerr << "Response structure version not supported: "
                  << response.struct_version << '\n';
        return false;
    }
    if (response.result != 0)
    {
        std::cerr << "Failed to issue SPS command" << '\n';
        return false;
    }

    return true;
}

std::optional<bool> HothDBus::getSpsPassthrough(const std::string& hothId)
{
    using google::hoth::internal::ReqHeader;
    using google::hoth::internal::RspHeader;

    ReqHeader req;
    memset(&req, 0, sizeof(req));
    req.struct_version = kStructVersion;
    req.command = EC_CMD_BOARD_SPECIFIC_BASE |
                  EC_PRV_CMD_HOTH_GET_SPS_PASSTHROUGH_STATUS;
    using google::hoth::internal::calculateChecksum;
    auto spanReq = stdplus::raw::asSpan<uint8_t>(req);
    uint8_t checksumNegated = calculateChecksum(spanReq);
    req.checksum = ~checksumNegated + 1;
    std::vector<uint8_t> bytes;
    callMethodAndRead("SendHostCommand", hothId, bytes, spanReq);

    auto header = stdplus::raw::copyFrom<RspHeader>(bytes);
    if (header.struct_version != kStructVersion)
    {
        std::cerr << "Response structure version not supported: "
                  << header.struct_version << '\n';
        return std::nullopt;
    }
    if (header.result != 0)
    {
        std::cerr << "Failed to issue SPS get passthrough status command"
                  << '\n';
        return std::nullopt;
    }

    auto response = stdplus::raw::copyFrom<SpsPassthroughStatusResponse>(bytes);
    return response.status.sps_passthrough_enabled;
}

bool HothDBus::expectConfirmPayload()
{
    PayloadConfirmRequest req;
    memset(&req, 0, sizeof(req));
    req.header.struct_version = kStructVersion;
    req.header.command = EC_CMD_BOARD_SPECIFIC_BASE |
                         EC_PRV_CMD_HOTH_PAYLOAD_UPDATE;
    req.header.data_len = sizeof(req.request);
    req.request.header.offset = 0;
    req.request.header.len = sizeof(req.request.confirm);
    req.request.header.type = PAYLOAD_UPDATE_CONFIRM;
    req.request.confirm.option = payload_update_confirm_option::Enable;
    req.request.confirm.timeout_value = 0;
    auto now = std::chrono::steady_clock::now();
    auto now_ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now);
    auto cookie = now_ms.time_since_epoch();
    req.request.confirm.confirmation_cookie =
        boost::endian::native_to_little(cookie.count());
    auto spanReq = stdplus::raw::asSpan<uint8_t>(req);
    using google::hoth::internal::calculateChecksum;
    uint8_t checksumNegated = calculateChecksum(spanReq);
    req.header.checksum = ~checksumNegated + 1;
    std::cerr << ": Expect confirm payload" << '\n';
    std::vector<uint8_t> bytes;
    callMethodAndRead("SendHostCommand", "", bytes, spanReq);

    std::span<uint8_t> response = bytes;
    using google::hoth::internal::RspHeader;
    auto header = stdplus::raw::extract<RspHeader>(response);
    if (header.struct_version != kStructVersion)
    {
        std::cerr << "Response structure version not supported: "
                  << header.struct_version << '\n';
        return false;
    }
    if (header.result == google::hoth::internal::EC_RES_INVALID_PARAM ||
        header.result == google::hoth::internal::EC_RES_ACCESS_DENIED)
    {
        std::cerr << "Ignoring expected payload confirm issue:" << header.result
                  << '\n';
        return true;
    }
    if (header.result != google::hoth::internal::EC_RES_SUCCESS)
    {
        std::cerr << "Failed to enable payload confirm: " << header.result
                  << header.result << '\n';
        return false;
    }
    auto confirmResponse =
        stdplus::raw::copyFrom<payload_update_confirm_response>(response);
    payload_update_confirm_timeout_values& val = confirmResponse.timeout_values;
    using boost::endian::little_to_native;
    std::cerr << "  min:" << little_to_native(val.min) << '\n';
    std::cerr << "  max:" << little_to_native(val.max) << '\n';
    std::cerr << "  default:" << little_to_native(val.default_val) << '\n';
    std::cerr << "  current:" << little_to_native(val.current) << '\n';

    return true;
}

} // namespace google::hoth::tools
