// 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 "host_command_interface.hpp"
#include "log_collector_util.hpp"
#include "message_intf.hpp"

#include <boost/asio.hpp>
#include <boost/asio/io_context.hpp>

#include <chrono>
#include <future>
#include <mutex>
#include <span>
#include <unordered_map>
#include <vector>

namespace google
{
namespace hoth
{
namespace internal
{

/** @class HostCommandImpl
 *  @brief HostCommandImpl method implementation
 *  @details Methods to send host commands to Hoth
 */
class HostCommandImpl : public HostCommand
{
  public:
    // 1024 erase blocks or 4MB takes ~12 seconds for most SPI devices
    static constexpr size_t kMaxErase = 1024 * 4096;
    // 16 MB on a 20MHz SPI takes ~9 seconds for most SPI devices
    static constexpr size_t kMaxVerify = 16 * 1024 * 1024;

    static constexpr int kMaxLogCollectorRetries = 3;

    explicit HostCommandImpl(MessageIntf* msg, boost::asio::io_context* ioc,
                             LogCollectorUtil* logCollectorUtil,
                             const std::string& name, size_t max_retries = 0,
                             bool allowLegacyVerify = true,
                             uint32_t uartChannelId = 0);

    std::vector<uint8_t> sendCommand(
        const std::vector<uint8_t>& command) override;
    std::vector<uint8_t> sendCommand(
        const std::vector<uint8_t>& command,
        std::chrono::milliseconds timeout) override;
    std::vector<uint8_t> sendCommand(uint16_t command, uint8_t commandVersion,
                                     const void* request,
                                     size_t requestSize) override;
    std::vector<uint8_t> sendCommand(
        uint16_t command, uint8_t commandVersion, const void* request,
        size_t requestSize, std::chrono::milliseconds timeout) override;
    uint64_t sendCommandAsync(const std::vector<uint8_t>& command) override;
    std::vector<uint8_t> getResponse(uint64_t callToken) override;
    bool communicationFailure() const override;

    /**
     * @brief Triggers collect hoth logs asynchronously. Does not wait for log
     * collection completion. If the requester wants to wait for log collection
     * completion, should run waitOnLogCollectorPromise() to wait
     *
     * @param[in] cleanupPromiseAfterExecution- if true cleans up the future
     * promise when request completes asynchronously. Will not cleanup the
     * request, if set false, in case requester wants to wait for the promise
     *
     * @return requestId: Every request would have a request id that the
     * requester can use to wait on and cleanup later
     */
    int collectHothLogsAsync(bool cleanupPromiseAfterExecution) override;

    /**
     * @brief Triggers collect uart logs scheduler asynchronously. If the
     * scheduler is already working (since it gets triggered on its own in
     * constructor) this function does nothing.
     */
    void collectUartLogsAsync() override;

    /**
     * @brief Stops the uart collector scheduler.
     */
    void stopUartLogs() override;

    /**
     * @brief When the requester wants to wait on the log collector request to
     * finish. Cleans up the request after promise fulfills
     */
    void waitOnLogCollectorPromise(int requestId);

    /** @brief Determines if a command will take too long to execute based
     *         on well known parameters. This is useful to prevent the SPI
     *         flash from remaining busy for too long. Allowing VERIFY is
     *         optional since some older platforms depend on it to exist.
     *         We limit this to <~15s to prevent IPMI and SPI channels from
     *         blocking too long.
     *
     *  @param[in] cmd - The command request bytes
     *  @param[in] allowLegacyVerify - If PAYLOAD_UPDATE_VERIFY is allowed
     *  @return An ec_status error for banning, EC_RES_SUCCESS otherwise
     */
    static uint8_t isCommandLongRunning(std::span<const uint8_t> cmd,
                                        bool allowLegacyVerify);

  private:
    /** @brief The same operation as sendHostCommand without holding the lock
     *  @note Requires the caller to hold the cmdLock
     *
     * @param[in] req - Host command
     * @return Response from the hoth
     */
    std::vector<uint8_t> sendCommandNoLock(const std::vector<uint8_t>& command);

    /** @brief Validate the given command and send it to Hoth
     *
     * @param[in] req - Host command
     */
    void validateAndSend(const std::vector<uint8_t>& req);

    /** @brief Receive a response from Hoth and validate it
     *
     * @param[out] rsp - Response from Hoth
     */
    void recvAndValidate(std::vector<uint8_t>& rsp);

    /**
     * @brief Collects hoth logs
     */
    void collectHothLogs();

    /**
     * @brief Collect Uart logs
     *
     * @param[in] offset - offset for the current read request
     *
     * @return offset for the next read request
     */
    uint32_t collectUartLogs(uint32_t offset);

    /**
     * @brief Gets the write offset from ec channel status command. This is
     * required for the first log collector command
     *
     * @return Optional channel write offset. In case of sendHostCommand failure
     * or invalid response received, we will return a nullopt that would stop
     * the scheduler as we need this to get the correct read input point
     */
    std::optional<little_uint32_t> getChannelWriteOffset();

    /**
     * @brief Sets promise value while collecting hoth logs for a unique request
     * id
     *
     * @param[in] requestId - Unique id for the log collector request
     */
    void setPromiseValue(int requestId);

    /**
     * @brief Sets promise exception while collecting hoth logs for a unique
     * request id
     *
     * @param[in] requestId - Unique id for the log collector request
     */
    void setPromiseException(int requestId);

    /**
     * @brief Cleans up the requests/promise from the map after execution or
     * wait is completed
     *
     * @param[in] requestId - Unique id for the log collector request
     */
    void cleanupLogCollectorRequest(int requestId);

    /**
     * @brief Schedules the log collector by waiting for kSleepUartTimeInSeconds
     * seconds between each request
     *
     * @param[in] offset - Offset for the current read request
     */
    void scheduleUartLogCollector(little_uint32_t offset = 0);

    /** @brief Connection to Hoth for sending and receiving messages */
    MessageIntf* msg;

    boost::asio::steady_timer timer; // Scheduler timer

    boost::asio::io_context* io;

    LogCollectorUtil* logCollectorUtil;

    std::string name; // Name for the uart endpoint if exists

    /** @brief Maximum number of times to retry communication */
    size_t max_retries;

    /** @brief Ensure only a single command is outstanding at a time
     *         since we don't know how to associate interleaved responses.
     */
    std::timed_mutex cmdLock;

    /** @brief Tracks failure to communicate with hoth */
    bool communicationFailed = false;

    /** @brief Do we allow for legacy verification */
    bool allowLegacyVerify;

    /** @brief Specifies the UART channel ID if hothd should collect and stream
     *         the device's UART logs*/
    uint32_t uartChannelId;

    bool runUartCollector = false; // Scheduler status

    int logCollectorRetryCounter = 0;

    /**
     * @brief Stores log collector request id to promise object until the
     * execution or wait request completes
     * */
    std::unordered_map<int, std::promise<void>> idToLogCollectorPromiseMap;
};

} // namespace internal

} // namespace hoth

} // namespace google
