#pragma once

#include <cstdint>
#include <fstream>
#include <memory>
#include <optional>
#include <string>
#include <string_view>
#include <vector>

namespace boot_time_monitor
{

const std::string kBTMonitorDir = "/usr/share/boot_time_monitor/";
const std::string kCheckpointFile = "checkpoints.csv";
const std::string kDurationFile = "durations.csv";
const std::string kCompletedSuffix = ".completed";

struct Checkpoint
{
    std::string name;
    int64_t wallTime;
    int64_t monoTime;

    Checkpoint(std::string name, int64_t wallTime, int64_t monoTime) :
        name(std::move(name)), wallTime(wallTime), monoTime(monoTime)
    {}
};

struct Duration
{
    std::string name;
    int64_t duration;

    Duration(std::string name, int64_t duration) :
        name(std::move(name)), duration(duration)
    {}
};

/**
 * An interface class for the Util APIs
 */
class UtilIface
{
  public:
    virtual ~UtilIface() = default;

    /**
     * Read uptime from `/proc/uptime`
     *
     * @return Current uptime in milliseconds
     */
    virtual std::optional<int64_t> getUpTimeInMs() = 0;

    /**
     * Get system time and covert it to the epoch time in milliseconds
     *
     * @return Current epoch time in milliseconds
     */
    virtual int64_t getWallTimeInMs() = 0;

    /**
     * Check if the input name is valid. This can be used to check both
     * checkpoint name and duration name
     *
     * @return true if the input name is valid
     */
    virtual bool isValidName(std::string_view name) = 0;

    /**
     * Get full file path of checkpoint record for a specific node
     *
     * @param[in] nodeName - Node name
     * @param[in] wantCompleted - Want `kCompletedSuffix` in the file path or
     * not
     * @return Full file path
     */
    virtual std::string getCPPath(std::string_view nodeName,
                                  bool wantCompleted) = 0;

    /**
     * Get full file path of duration record for a specific node
     *
     * @param[in] nodeName - Node name
     * @param[in] wantCompleted - Want `kCompletedSuffix` in the file path or
     * not
     * @return Full file path
     */
    virtual std::string getDurPath(std::string_view nodeName,
                                   bool wantCompleted) = 0;
};

/**
 * Utility implementation class
 */
class Util : public UtilIface
{
  public:
    std::optional<int64_t> getUpTimeInMs() override;
    int64_t getWallTimeInMs() override;
    bool isValidName(std::string_view name) override;
    std::string getCPPath(std::string_view nodeName,
                          bool wantCompleted) override;
    std::string getDurPath(std::string_view nodeName,
                           bool wantCompleted) override;
};

/**
 * An interface class for the FileUtil APIs
 */
class FileUtilIface
{
  public:
    virtual ~FileUtilIface() = default;

    /**
     * Add a new checkpoint record in file
     *
     * @param[in] name - Checkpoint name
     * @param[in] wallTimeInMs - Current epoch time in milliseconds
     * @param[in] monoTimeInMs - Current monotonic time in milliseconds
     * (Typically it's from `/proc/uptime`)
     */
    virtual void addCheckpoint(std::string_view name, int64_t wallTimeInMs,
                               int64_t monoTimeInMs) = 0;

    /**
     * Add a new duration record in file
     *
     * @param[in] name - Duration name
     * @param[in] durationInMs - Duration in milliseconds
     */
    virtual void addDuration(std::string_view name, int64_t durationInMs) = 0;

    /**
     * Close current file and rename it with suffix `kCompletedSuffix`
     */
    virtual void completeCurrent() = 0;

    /**
     * Load checkpoints from file
     *
     * @param[in] loadCompleted - Load file with `kCompletedSuffix` or not
     * @return Smart pointer of vector of checkpoints
     */
    virtual std::unique_ptr<std::vector<Checkpoint>>
        loadCheckpoints(bool loadCompleted) = 0;

    /**
     * Load durations from file
     *
     * @param[in] loadCompleted - Load file with `kCompletedSuffix` or not
     * @return Smart pointer of vector of durations
     */
    virtual std::unique_ptr<std::vector<Duration>>
        loadDurations(bool loadCompleted) = 0;

    /**
     * Is current file empty
     *
     * @return true if file is empty
     */
    virtual bool isEmpty() = 0;
};

/**
 * FileUtil implementation class
 */
class FileUtil : public FileUtilIface
{
  public:
    explicit FileUtil(std::string_view filename);
    void addCheckpoint(std::string_view name, int64_t wallTimeInMs,
                       int64_t monoTimeInMs) override;
    void addDuration(std::string_view name, int64_t durationInMs) override;
    void completeCurrent() override;
    std::unique_ptr<std::vector<Checkpoint>>
        loadCheckpoints(bool loadCompleted) override;
    std::unique_ptr<std::vector<Duration>>
        loadDurations(bool loadCompleted) override;
    bool isEmpty() override;

  protected:
    std::string filename;
    std::unique_ptr<std::ofstream> ofs;
};

} // namespace boot_time_monitor
