#include "KeyGroupsSavepointStateHandle.h"
#include "state/KeyGroupsStateHandle.h"
#include <sstream>
#include <memory>
KeyGroupsSavepointStateHandle::KeyGroupsSavepointStateHandle(
    const KeyGroupRangeOffsets& groupRangeOffsets,
    const std::shared_ptr<StreamStateHandle>& streamStateHandle)
    : KeyGroupsStateHandle(groupRangeOffsets, streamStateHandle)
{
}

KeyGroupsSavepointStateHandle::KeyGroupsSavepointStateHandle(const nlohmann::json &description)
    : KeyGroupsStateHandle(description)
{
}

std::shared_ptr<KeyedStateHandle>
KeyGroupsSavepointStateHandle::GetIntersection(const KeyGroupRange& keyGroupRange) const
{
    auto offsets = getGroupRangeOffsets().getIntersection(keyGroupRange);
    if(offsets.getKeyGroupRange().getNumberOfKeyGroups() <= 0) {
        return nullptr;
    }
    return std::make_shared<KeyGroupsSavepointStateHandle>(
        offsets,
        getDelegateStateHandle());
}
std::string KeyGroupsSavepointStateHandle::ToString() const
{
    nlohmann::json json;
    json["stateHandleName"] = "KeyGroupsSavepointStateHandle";
    json["stateHandleId"] = nlohmann::json::parse(GetStateHandleId().ToString());
    json["groupRangeOffsets"] = nlohmann::json::parse(getGroupRangeOffsets().ToString());
    if (getDelegateStateHandle() != nullptr) {
        nlohmann::json streamStateHandle = nlohmann::json::parse(getDelegateStateHandle()->ToString());
        json["streamStateHandle"] = streamStateHandle;
        json["stateHandle"] = streamStateHandle;
    } else {
        json["streamStateHandle"] = nullptr;
        json["stateHandle"] = nullptr;
    }
    return json.dump();
}