// 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 "log_collector_util.hpp"

#include "message_intf.hpp"
#include "message_util.hpp"

#include <fmt/core.h>

#include <chrono>
#include <cstring>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <regex>
#include <span>
#include <vector>

namespace google
{
namespace hoth
{
namespace internal
{
namespace fs = std::filesystem;

LogCollectorUtil::LogCollectorUtil(RateLimiter& rateLimiter,
                                   int asyncWaitTime) :
    rateLimiter(rateLimiter), asyncWaitTime(asyncWaitTime)
{}

std::vector<uint8_t> LogCollectorUtil::generateSnapshotRequest()
{
    std::vector<uint8_t> static const requestBuffer(kTransactionBufferSize -
                                                    sizeof(struct ReqHeader));

    struct ReqHeader requestHeader;
    populateReqHeader(EC_CMD_CONSOLE_REQUEST, /*commandVersion*/ 0x00,
                      requestBuffer.data(), /*requestPayloadSize*/ 0,
                      &requestHeader);
    auto const requestHeaderPtr = reinterpret_cast<uint8_t*>(&requestHeader);
    std::vector<uint8_t> populatedCommand(requestHeaderPtr,
                                          requestHeaderPtr + sizeof(ReqHeader));

    if constexpr (kDebug)
    {
        // snapshot doesn't return any buffer response
        fmt::println(stderr, "Request size: ", populatedCommand.size());
    }
    return populatedCommand;
}

std::vector<uint8_t> LogCollectorUtil::generateGrabSnapshotRequest()
{
    struct ec_params_console_read_v1 readSnapshotReq = {.subcmd =
                                                            CONSOLE_READ_NEXT};

    struct ReqHeader consoleReadReqHdr;

    populateReqHeader(EC_CMD_CONSOLE_READ, /*commandVersion*/ 0x00,
                      static_cast<void*>(&readSnapshotReq),
                      sizeof(readSnapshotReq), &consoleReadReqHdr);

    auto const consoleReadReqHdrPtr =
        reinterpret_cast<uint8_t*>(&consoleReadReqHdr);
    auto const consoleReadReqPtr =
        reinterpret_cast<const uint8_t*>(&readSnapshotReq);

    std::vector<uint8_t> populatedCommandConsoleRead(
        consoleReadReqHdrPtr, consoleReadReqHdrPtr + sizeof(consoleReadReqHdr));

    populatedCommandConsoleRead.insert(
        populatedCommandConsoleRead.end(), consoleReadReqPtr,
        consoleReadReqPtr + sizeof(readSnapshotReq));

    return populatedCommandConsoleRead;
}

bool LogCollectorUtil::isResponseValid(std::vector<uint8_t> response)
{
    std::span<const uint8_t> output = response;
    const auto& responseHeader = stdplus::raw::extractRef<RspHeader>(output);

    if constexpr (kDebug)
    {
        fmt::println(stderr, "Response Header result: {}",
                     static_cast<uint8_t>(responseHeader.result));
    }

    if (responseHeader.result != 0)
    {
        fmt::println(stderr,
                     "Log Collector command received a bad "
                     "response while getting logs. Unsuccessful response "
                     "code:  {}",
                     static_cast<uint16_t>(responseHeader.result));
        return false;
    }

    if constexpr (kDebug)
    {
        fmt::println(stderr, "checksum : {}",
                     static_cast<uint8_t>(responseHeader.checksum));
        fmt::println(stderr, "result : {}",
                     static_cast<uint16_t>(responseHeader.result));
        fmt::println(stderr, "data_len : {}",
                     static_cast<uint16_t>(responseHeader.data_len));
        fmt::println(stderr, "reserved : {}",
                     static_cast<uint16_t>(responseHeader.reserved));
    }
    return true;
}

void LogCollectorUtil::writeToFile(std::string_view data, std::string_view name)
{
    std::string filePath = fmt::format("{}{}.log", kSyslogFileNamePrefix, name);
    if (data.empty())
    {
        fmt::println(stderr, "No data to publish to filePath: {}", filePath);
        return;
    }
    std::string meta;
    if (!fs::exists(filePath))
    {
        meta =
            fmt::format("{} : Uart File does not exist: {}\n", name, filePath);
    }
    else
    {
        std::uintmax_t fileSize = fs::file_size(filePath);

        if ((fileSize >= kMaxFileSizeInBytes) ||
            ((kMaxFileSizeInBytes - fileSize) <= data.size()))
        {
            meta = fmt::format(
                "{} {} : Uart log file size exceeds the limit. Rotating...\n",
                meta, name);

            if (!fs::remove(filePath))
            {
                fmt::println(
                    stderr,
                    "{}\nError deleting the uart log file {}. "
                    "Not writing to Uart log file, since it can hog memory\n",
                    meta, filePath);
                return;
            }
            meta = fmt::format(
                "{} {} : Old file deleted! New Uart file will be created\n",
                meta, name);
        }
    }
    std::ofstream outputFile(filePath, std::ios::app);

    if (!outputFile.is_open())
    {
        fmt::println(stderr, "Error opening the UART log file: {}", filePath);
        return;
    }
    outputFile << meta << std::endl;
    outputFile << data << std::endl;
    outputFile.close();
    if constexpr (kDebug)
    {
        fmt::println(stderr, "Written to file {}", filePath);
    }
}

void LogCollectorUtil::publishSnapshot(
    std::vector<uint8_t> response,
    PublishType publishType = PublishType::Stderr,
    std::string_view filePathSuffix, std::string_view meta)
{
    switch (publishType)
    {
        case PublishType::Stderr:
        {
            std::string result(response.begin(), response.end());
            fmt::println(stderr, "{} ", result);
            fmt::println(stderr, "=Buffer size printed: {}=", response.size());
            break;
        }
        case PublishType::File:
        {
            std::string suffix;
            if (filePathSuffix.empty())
            {
                fmt::println(stderr,
                             "Failure to publish due to filepath empty");
                return;
            }

            std::string result(response.begin(), response.end());
            std::regex newlineRegex("\n");
            std::string replacementString =
                fmt::format("\n{} : ", filePathSuffix);
            std::string taggedString =
                std::regex_replace(result, newlineRegex, replacementString);
            if (!meta.empty())
            {
                taggedString = fmt::format("{} {}\n{}", filePathSuffix, meta,
                                           taggedString);
            }

            writeToFile(taggedString, filePathSuffix);
            break;
        }
        default:
            break; // no op
    }
}

int LogCollectorUtil::generateRequestId()
{
    requestCounter++;
    if (requestCounter >= 1000)
    {
        requestCounter = 0;
    }
    return requestCounter;
}

std::vector<uint8_t> LogCollectorUtil::generateGetChannelWriteOffsetRequest(
    const uint32_t& channelId) const
{
    if constexpr (kDebug)
    {
        fmt::println(stderr,
                     "Getting the hoth channel status for offset for {}...",
                     channelId);
    }

    struct ec_channel_status_request request;
    request.channel_id = channelId;

    struct ReqHeader requestHeader;
    populateReqHeader(EC_CMD_BOARD_SPECIFIC_BASE +
                          EC_PRV_CMD_HOTH_CHANNEL_STATUS,
                      /*commandVersion*/ 0x00, static_cast<void*>(&request),
                      sizeof(request), &requestHeader);

    auto const requestHeaderPtr = reinterpret_cast<uint8_t*>(&requestHeader);
    auto const requestPtr = reinterpret_cast<const uint8_t*>(&request);
    std::vector<uint8_t> populatedCommand(
        requestHeaderPtr, requestHeaderPtr + sizeof(requestHeader));
    populatedCommand.insert(populatedCommand.end(), requestPtr,
                            requestPtr + sizeof(request));
    return populatedCommand;
}

std::vector<uint8_t> LogCollectorUtil::generateCollectUartLogsRequest(
    const uint32_t channelId, const uint32_t readOffset) const
{
    struct ec_channel_read_request request = {
        .channel_id = channelId,
        .offset = readOffset,
        .size = kTransactionBufferSize,
        .timeout_us = kTransactionTimeoutInMicroSec,
    };

    struct ReqHeader requestHeader;
    populateReqHeader(EC_CMD_BOARD_SPECIFIC_BASE + EC_CMD_HOTH_CHANNEL_READ,
                      /*commandVersion*/ 0x00, static_cast<void*>(&request),
                      sizeof(request), &requestHeader);

    auto const requestHeaderPtr = reinterpret_cast<uint8_t*>(&requestHeader);
    auto const requestPtr = reinterpret_cast<const uint8_t*>(&request);
    std::vector<uint8_t> populatedCommand(
        requestHeaderPtr, requestHeaderPtr + sizeof(requestHeader));
    populatedCommand.insert(populatedCommand.end(), requestPtr,
                            requestPtr + sizeof(request));
    return populatedCommand;
}

void LogCollectorUtil::heartbeat(std::string_view message)
{
    fmt::println(stderr, "{}", message);
}

int LogCollectorUtil::getAsyncWaitTime()
{
    return this->asyncWaitTime;
}

} // namespace internal
} // namespace hoth
} // namespace google
