// 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.

#pragma once

#include "google3/host_commands.h"

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

#include <sdbusplus/bus.hpp>
#include <sdbusplus/message.hpp>
#include <xyz/openbmc_project/Control/Hoth/server.hpp>

#include <optional>
#include <span>
#include <string>
#include <vector>

namespace google::hoth::tools
{
struct PayloadVersionResponse
{
    google::hoth::internal::RspHeader header;
    payload_status_response status;
};

struct SpsPassthroughStatusResponse
{
    google::hoth::internal::RspHeader header;
    ec_response_sps_passthrough_status status;
};

struct TargetResetRequest
{
    google::hoth::internal::ReqHeader header;
    ec_request_reset_target request;
};

struct PayloadConfirmRequest
{
    google::hoth::internal::ReqHeader header;
    google::hoth::internal::ConfirmRequest request;
};

class HothDBus : public DBusInterface
{
  public:
    using FirmwareUpdateStatus = sdbusplus::xyz::openbmc_project::Control::
        server::Hoth::FirmwareUpdateStatus;
    HothDBus() : dbus(sdbusplus::bus::new_system())
    {}
    std::optional<std::string>
        getPayloadVersion(const std::string& hothId,
                          payload_update::VersionType type) override;
    bool sendPayloadAndVerify(const std::string& hothId,
                              const std::string& payloadFile) override;
    bool sendStaticWPPayloadAndVerify(const std::string& hothId,
                                     const std::string& payloadFile) override;
    bool activatePayload(const std::string& hothId) override;
    bool deactivatePayload(const std::string& hothId) override;
    bool confirmPayload(const std::string& hothId) override;
    bool eraseStagingArea(const std::string& hothId) override;
    bool setTargetResetOption(const std::string& hothId,
                              ec_target_reset_option option) override;
    bool setSpsPassthrough(const std::string& hothId,
                           bool enable) override;
    std::optional<bool> getSpsPassthrough(const std::string& hothId) override;
    bool expectConfirmPayload() override;

  private:
    template <typename... Vargs>
    sdbusplus::message::message callMethod(const char* method,
                                           const std::string& hothId,
                                           Vargs&&... vargs);
    template <typename T, typename... Vargs>
    void callMethodAndRead(const char* method, const std::string& hothId,
                           T& value, Vargs&&... vargs);
    FirmwareUpdateStatus getVerifyPayloadStatus(const std::string& hothId);
    FirmwareUpdateStatus getSendPayloadStatus(const std::string& hothId);
    bool verifyPayload(const std::string& hothId);
    sdbusplus::bus::bus dbus;
};
} // namespace google::hoth::tools
