/*
 *
 *    Copyright (c) 2020 Project CHIP Authors
 *    All rights reserved.
 *
 *    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.
 */

/*
 * @file PigweedLogger.cpp
 *
 * This file contains a backend of Zephyr logging system, based on Pigweed HDLC
 * over UART transport. It allows to send log messages even if the application
 * needs to use HDLC/UART for another purpose like the RPC server.
 */

#include <zephyr/logging/log.h>
#include <zephyr/logging/log_backend.h>
#include <zephyr/logging/log_backend_std.h>
#include <zephyr/logging/log_output.h>
#include <zephyr/zephyr.h>

#include <pw_hdlc/encoder.h>
#include <pw_stream/sys_io_stream.h>
#include <pw_sys_io_nrfconnect/init.h>

#include "pw_span/span.h"
#include <cassert>
#include <cstdint>
#include <string_view>

namespace PigweedLogger {
namespace {

#if CONFIG_LOG

#if !CONFIG_LOG_MODE_IMMEDIATE
#error "Backend of Zephyr logger based on Pigweed HDLC requires LOG_MODE_IMMEDIATE=y"
#endif

constexpr uint8_t kLogHdlcAddress = 1;   // Send log messages to HDLC address 1 (other than RPC communication)
constexpr size_t kWriteBufferSize = 128; // Buffer for constructing HDLC frames

// Exclusive access to the backend is needed to make sure that log messages coming
// from different threads are not interwoven.
K_SEM_DEFINE(sLoggerLock, 1, 1);
pw::stream::SysIoWriter sWriter;
size_t sWriteBufferPos;
uint8_t sWriteBuffer[kWriteBufferSize];
bool sIsPanicMode;

void flush()
{
    pw::hdlc::WriteUIFrame(kLogHdlcAddress, pw::as_bytes(pw::span(sWriteBuffer, sWriteBufferPos)), sWriter);
    sWriteBufferPos = 0;
}

int putString(uint8_t * buffer, size_t size, void * /* ctx */)
{
    assert(sWriteBufferPos < kWriteBufferSize);

    for (size_t i = 0; i < size; ++i)
    {
        // Send each line excluding "\r\n" in a separate frame

        if (buffer[i] == '\r')
            continue;

        if (buffer[i] == '\n')
        {
            flush();
            continue;
        }

        sWriteBuffer[sWriteBufferPos++] = buffer[i];

        if (sWriteBufferPos == kWriteBufferSize)
            flush();
    }

    return size;
}

LOG_OUTPUT_DEFINE(pigweedLogOutput, putString, nullptr, 0);

void init(const log_backend *)
{
    pw_sys_io_Init();
}

void processMessage(const struct log_backend * const backend, union log_msg2_generic * msg)
{
    int ret = k_sem_take(&sLoggerLock, K_FOREVER);
    assert(ret == 0);

    if (!sIsPanicMode)
    {
        log_format_func_t outputFunc = log_format_func_t_get(LOG_OUTPUT_TEXT);

        outputFunc(&pigweedLogOutput, &msg->log, log_backend_std_get_flags());
    }

    k_sem_give(&sLoggerLock);
}

void panic(const log_backend *)
{
    int ret = k_sem_take(&sLoggerLock, K_FOREVER);
    assert(ret == 0);

    log_backend_std_panic(&pigweedLogOutput);
    flush();
    sIsPanicMode = true;

    k_sem_give(&sLoggerLock);
}

const log_backend_api pigweedLogApi = {
    .process = processMessage,
    .panic   = panic,
    .init    = init,
};

LOG_BACKEND_DEFINE(pigweedLogBackend, pigweedLogApi, /* autostart */ true);

#endif // CONFIG_LOG

} // namespace

k_sem * GetSemaphore()
{
#if CONFIG_LOG
    return &sLoggerLock;
#else
    return nullptr;
#endif
}

} // namespace PigweedLogger
