/**
 * @brief Log storage.
 *
 * This file is part of HostLogger project.
 *
 * Copyright (c) 2018 YADRO
 *
 * 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 <ctime>
#include <list>
#include <string>
#include <zlib.h>


/** @class LogStorage
 *  @brief Log storage implementation.
 *         All functions within this class are not thread-safe.
 */
class LogStorage
{
public:
    /** @brief Constructor. */
    LogStorage();

    /** @brief Parse input log stream and append messages to the storage.
     *
     *  @param[in] data - pointer to the message buffer
     *  @param[in] len - length of the buffer in bytes
     */
    void parse(const char* data, size_t len);

    /** @brief Clear (reset) storage. */
    void clear();

    /** @brief Check storage for empty.
     *
     *  @return true if storage is empty
     */
    bool empty() const;

    /** @brief Save messages from storage to the specified file.
     *
     *  @param[in] fileName - path to the file
     *
     *  @return error code, 0 if operation completed successfully
     */
    int write(const char* fileName) const;

private:
    /** @struct Message
     *  @brief Represent log message (single line from host log).
     */
    struct Message
    {
        /** @brief Timestamp (message creation time). */
        time_t timeStamp;
        /** @brief Text of the message. */
        std::string text;
    };

    /** @brief Append new message to the storage.
     *
     *  @param[in] msg - pointer to the message buffer
     *  @param[in] len - length of the buffer in bytes
     */
    void append(const char* msg, size_t len);

    /** @brief Write message to the file.
     *
     *  @param[in] fd - descriptor of the file to write
     *  @param[in] msg - message to write
     *
     *  @return error code, 0 if operation completed successfully
     */
    int write(gzFile fd, const Message& msg) const;

    /** @brief Shrink storage by removing oldest messages. */
    void shrink();

private:
    /** @brief List of messages. */
    std::list<Message> messages_;
    /** @brief Flag to indicate that the last message is incomplete. */
    bool last_complete_;
};
