/*
 *    Copyright (c) 2025 Project CHIP Authors
 *    All rights reserved.
 *
 *    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 an interface for objects interested in MRP events for analytics
 */

#pragma once

#include <optional>

#include <lib/core/DataModelTypes.h>
#include <lib/core/NodeId.h>
#include <system/SystemClock.h>

namespace chip {
namespace Messaging {

class ReliableMessageAnalyticsDelegate
{
public:
    virtual ~ReliableMessageAnalyticsDelegate() = default;

    enum class SessionType
    {
        kEstablishedCase,
        // Initially, we are starting with only one session type, but we are considering the future when we expand to allow
        // other session types, such as establishing a CASE session.
    };

    enum class EventType
    {
        // Event associated with first time this specific message is sent.
        kInitialSend,
        // Event associated with re-transmitting a message that was previously sent but not acknowledged.
        kRetransmission,
        // Event associated with receiving an acknowledgement of a previously sent message.
        kAcknowledged,
        // Event associated with transmission of a message that failed to be acknowledged.
        kFailed,
    };

    struct TransmitEvent
    {
        // When the session has a peer node ID, this will be a value other than kUndefinedNodeId.
        NodeId nodeId = kUndefinedNodeId;
        // When the session has a fabric index, this will be a value other than kUndefinedFabricIndex.
        FabricIndex fabricIndex = kUndefinedFabricIndex;
        // Session type of session the message involved is being sent on.
        SessionType sessionType = SessionType::kEstablishedCase;
        // The transmit event type.
        EventType eventType = EventType::kInitialSend;
        // The outgoing message counter associated with the event. If there is no outgoing message counter
        // this value will be 0.
        uint32_t messageCounter = 0;
        // If the eventType is kRetransmission, this value will be populated with the number of the
        // retransmission attempt. A value of 1 indicates the first retransmission (i.e. the second
        // transmission of the message). This value should never be 0.
        std::optional<uint8_t> retransmissionCount;
        // When eventType is kAcknowledged, this will be populated with the number of milliseconds
        // that have elapsed between when the initial message was sent and when we received
        // acknowledgment for the message.
        std::optional<System::Clock::Milliseconds64> ackLatencyMs;
    };

    virtual void OnTransmitEvent(const TransmitEvent & event) = 0;
};

} // namespace Messaging
} // namespace chip
