// 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 <chrono>
#include <cstdint>
#include <future>
#include <vector>

namespace google
{
namespace hoth
{
namespace internal
{

/** @class HostCommand
 *  @brief Overridable HostCommand methods
 */
class HostCommand
{
  public:
    virtual ~HostCommand() = default;
    virtual std::vector<uint8_t>
        sendCommand(const std::vector<uint8_t>& command) = 0;
    virtual std::vector<uint8_t>
        sendCommand(const std::vector<uint8_t>& command,
                    std::chrono::milliseconds timeout) = 0;
    virtual std::vector<uint8_t> sendCommand(uint16_t command,
                                             uint8_t commandVersion,
                                             const void* request,
                                             size_t requestSize) = 0;
    virtual std::vector<uint8_t>
        sendCommand(uint16_t command, uint8_t commandVersion,
                    const void* request, size_t requestSize,
                    std::chrono::milliseconds timeout) = 0;
    virtual uint64_t sendCommandAsync(const std::vector<uint8_t>& command) = 0;
    virtual std::vector<uint8_t> getResponse(uint64_t callToken) = 0;
    virtual bool communicationFailure() const = 0;
    virtual int
        collectHothLogsAsync(bool cleanupPromiseAfterExecution) = 0;

    virtual void collectUartLogsAsync() = 0;

    virtual void stopUartLogs() = 0;
};

} // namespace internal

} // namespace hoth

} // namespace google
