#pragma once

#include <functional>
#include <libnetconf2/messages_client.h>
#include <memory>
#include <optional>
#include <string>
#include <string_view>
#include <vector>

struct nc_session;

namespace libyang {
class Data_Node;
class Context;
}

namespace libnetconf {
namespace client {

class ReportedError : public std::runtime_error {
public:
    ReportedError(const std::string& what);
    ~ReportedError() override;
};

using KbdInteractiveCb = std::function<std::string(const std::string&, const std::string&, const std::string&, bool)>;

class Session {
public:
    Session(struct nc_session* session);
    ~Session();
    static std::unique_ptr<Session> connectPubkey(const std::string& host, const uint16_t port, const std::string& user, const std::string& pubPath, const std::string& privPath);
    static std::unique_ptr<Session> connectKbdInteractive(const std::string& host, const uint16_t port, const std::string& user, const KbdInteractiveCb& callback);
    static std::unique_ptr<Session> connectSocket(const std::string& path);
    static std::unique_ptr<Session> connectFd(const int source, const int sink);
    [[nodiscard]] std::vector<std::string_view> capabilities() const;
    std::shared_ptr<libyang::Data_Node> getConfig(const NC_DATASTORE datastore,
                                                  const std::optional<const std::string> filter = std::nullopt); // TODO: arguments...
    std::shared_ptr<libyang::Data_Node> get(const std::optional<std::string>& filter = std::nullopt);
    std::string getSchema(const std::string_view identifier, const std::optional<std::string_view> version);
    void editConfig(const NC_DATASTORE datastore,
                    const NC_RPC_EDIT_DFLTOP defaultOperation,
                    const NC_RPC_EDIT_TESTOPT testOption,
                    const NC_RPC_EDIT_ERROPT errorOption,
                    const std::string& data);
    void copyConfigFromString(const NC_DATASTORE target, const std::string& data);
    std::shared_ptr<libyang::Data_Node> rpc_or_action(const std::string& xmlData);
    void copyConfig(const NC_DATASTORE source, const NC_DATASTORE destination);
    void commit();
    void discard();

    std::shared_ptr<libyang::Context> libyangContext();
    struct nc_session* session_internal(); // FIXME: remove me
protected:
    struct nc_session* m_session;
};
}
}
