/*
* Copyright (c), Huawei Technologies Co., Ltd. 2024-2024.All rights reserved.
 */
#ifndef GRAPHMANAGER_H
#define GRAPHMANAGER_H

#include <unordered_map>
#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include <set>
#include "defs/ConceptDefs.h"
#include "Smoother/SmootherBase.h"
#include "Util/ScalaryProtocolUtil.h"

using namespace Insight::Scalar::Smoothing;

namespace Insight::Scalar::GraphOp {
using namespace Protocol;

struct GraphData
{
    std::string tag_;
    std::string filePath_;
    std::vector<ScalarPoint> lineData_;
};

class Graph
{
public:
    Graph() = default;
    /**
     * @brief constructor of Graph, the graphId and tag is need
     * @param graphId
     * @param tag
     */
    explicit Graph(std::string tag) : tag_(std::move(tag))
    {
    };
    void UpdateData(const std::string& file, std::vector<ScalarPoint>&& data);

    std::vector<LineData> GetFileData(const std::string& file, uint64_t left, uint64_t right, DataMode mode);

    void UpdateSmoothingParam(const std::string& file, std::unique_ptr<Smoothing::SmoothingParamBase> sampleParam);

    std::vector<std::string> GetDataFiles();
    bool InnerFile(const std::string& file);

    void AddFile(const std::string& file);

    void DelFile(const std::string& file);

private:
    std::string tag_;
    std::set<std::string> dataFiles_;
};

class GraphManager
{
public:
    /**
     * @brief
     * @param tag
     * @param file
     * @param left
     * @param right
     * @param mode
     * @return
     */
    std::vector<LineData> GetGraphData(const std::string& tag, const std::string& file, uint64_t left, uint64_t right,
                                       DataMode mode);

    void
    UpdateGraphSmoothingParam(const std::string& tag, const std::string& file,
                              std::unique_ptr<SmoothingParamBase> param);
    void UpdateGraphData(const std::string& tag, const std::string& file, std::vector<ScalarPoint>&& data);
    std::shared_ptr<Graph> GetGraph(const std::string& tag);
    void Reset();
    std::unordered_map<std::string, std::vector<std::string>> GetAllGraphInfo();
    void GetFileTags(std::string& path, std::set<std::string>& tags);

private:
    bool GraphExits(const std::string& tag);

    std::unordered_map<std::string, std::shared_ptr<Graph>> graphs_;
};
}
#endif //GRAPHMANAGER_H