/*
 * Copyright (C) 2020 CESNET, https://photonics.cesnet.cz/
 *
 * Written by Václav Kubernát <kubernat@cesnet.cz>
 *
*/

#pragma once

#include <libyang-cpp/Context.hpp>
#include "datastore_access.hpp"

/*! \class YangAccess
 *     \brief Implementation of DatastoreAccess with a local libyang data node instance
 */

enum class StrictDataParsing {
    Yes,
    No
};

class YangSchema;

struct ly_ctx;
struct lyd_node;

class YangAccess : public DatastoreAccess {
public:
    YangAccess();
    YangAccess(std::shared_ptr<YangSchema> schema);
    ~YangAccess() override;
    [[nodiscard]] Tree getItems(const std::string& path) const override;
    void setLeaf(const std::string& path, leaf_data_ value) override;
    void createItem(const std::string& path) override;
    void deleteItem(const std::string& path) override;
    void moveItem(const std::string& source, std::variant<yang::move::Absolute, yang::move::Relative> move) override;
    void commitChanges() override;
    void discardChanges() override;
    [[noreturn]] Tree execute(const std::string& path, const Tree& input) override;
    void copyConfig(const Datastore source, const Datastore destination) override;

    std::shared_ptr<Schema> schema() override;

    void setEnabledFeatures(const std::string& module, const std::vector<std::string>& features);
    [[nodiscard]] std::string dump(const DataFormat format) const override;

    void loadModule(const std::string& name);
    void addSchemaFile(const std::string& path);
    void addSchemaDir(const std::string& path);
    void addDataFile(const std::string& path, const StrictDataParsing strict);

private:
    std::vector<ListInstance> listInstances(const std::string& path) override;
    [[noreturn]] void impl_execute(const std::string& type, const std::string& path, const Tree& input);

    [[noreturn]] void getErrorsAndThrow() const;
    void impl_newPath(const std::string& path, const std::optional<std::string>& value = std::nullopt);
    void impl_removeNode(const std::string& path);
    void validate();

    libyang::Context m_ctx;
    std::optional<libyang::DataNode> m_datastore;
    std::shared_ptr<YangSchema> m_schema;
};
