/*
 *    Copyright (c) 2021 Project CHIP Authors
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

/**
 *    @file
 *      This file defines the Matter Group message counters of remote nodes for groups.
 *
 */
#pragma once

#include <array>
#include <bitset>

#include <lib/core/CHIPPersistentStorageDelegate.h>
#include <lib/core/DataModelTypes.h>
#include <lib/core/NodeId.h>
#include <lib/core/PeerId.h>
#include <lib/support/Span.h>
#include <transport/PeerMessageCounter.h>

#define GROUP_MSG_COUNTER_MIN_INCREMENT 1000

namespace chip {
namespace Transport {

class GroupSender
{
public:
    NodeId mNodeId = kUndefinedNodeId;
    PeerMessageCounter msgCounter;
};

class GroupFabric
{
public:
    FabricIndex mFabricIndex  = kUndefinedFabricIndex;
    uint8_t mControlPeerCount = 0;
    uint8_t mDataPeerCount    = 0;
    GroupSender mDataGroupSenders[CHIP_CONFIG_MAX_GROUP_DATA_PEERS];
    GroupSender mControlGroupSenders[CHIP_CONFIG_MAX_GROUP_CONTROL_PEERS];
};

class GroupPeerTable
{
public:
    CHIP_ERROR FindOrAddPeer(FabricIndex fabricIndex, NodeId nodeId, bool isControl,
                             chip::Transport::PeerMessageCounter *& counter);

    // Used in case of MCSP failure
    CHIP_ERROR RemovePeer(FabricIndex fabricIndex, NodeId nodeId, bool isControl);

    CHIP_ERROR FabricRemoved(FabricIndex fabricIndex);

    // Protected for Unit Tests inheritance
protected:
    bool RemoveSpecificPeer(GroupSender * list, NodeId nodeId, uint32_t size);
    void CompactPeers(GroupSender * list, uint32_t size);
    void RemoveAndCompactFabric(uint32_t tableIndex);

    GroupFabric mGroupFabrics[CHIP_CONFIG_MAX_FABRICS];
};

// Might want to rename this so that it is explicitly the sending side of counters
class GroupOutgoingCounters
{
public:
    GroupOutgoingCounters(){};
    GroupOutgoingCounters(chip::PersistentStorageDelegate * storage_delegate);
    CHIP_ERROR Init(chip::PersistentStorageDelegate * storage_delegate);
    uint32_t GetCounter(bool isControl);
    CHIP_ERROR IncrementCounter(bool isControl);

    // Protected for Unit Tests inheritance
protected:
    // TODO Initialize those to random value
    uint32_t mGroupDataCounter                 = 0;
    uint32_t mGroupControlCounter              = 0;
    chip::PersistentStorageDelegate * mStorage = nullptr;
};

} // namespace Transport
} // namespace chip
