/**
 *
 *    Copyright (c) 2020 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.
 */

#pragma once

/** @addtogroup aftypes Zigbee Application Framework Types Reference
 * This documentation describes the types used by the Zigbee
 * Application Framework.
 * @{
 */

#include <stdbool.h> // For bool
#include <stddef.h>  // For NULL.
#include <stdint.h>  // For various uint*_t types

#include <app/util/af-enums.h>
#include <app/util/basic-types.h>
#include <app/util/types_stub.h> // For various types.

#include <app/util/attribute-metadata.h> // EmberAfAttributeMetadata

#include <app/ConcreteAttributePath.h>
#include <lib/support/Variant.h>
#include <messaging/ExchangeContext.h>

#ifdef EZSP_HOST
#include "app/util/ezsp/ezsp-enum.h"
#endif

/**
 * @brief Type for the cluster mask
 */
typedef uint8_t EmberAfClusterMask;

/**
 * @brief Generic function type, used for either of the cluster function.
 *
 * This type is used for the array of the cluster functions, and should
 * always be cast into one of the specific functions before being called.
 */
typedef void (*EmberAfGenericClusterFunction)(void);

/**
 * @brief A distinguished manufacturer code that is used to indicate the
 * absence of a manufacturer-specific cluster, command, or attribute.
 */
#define EMBER_AF_NULL_MANUFACTURER_CODE 0x0000

/**
 * @brief Struct describing cluster
 */
typedef struct
{
    /**
     *  ID of cluster according to ZCL spec
     */
    chip::ClusterId clusterId;
    /**
     * Pointer to attribute metadata array for this cluster.
     */
    const EmberAfAttributeMetadata * attributes;
    /**
     * Total number of attributes
     */
    uint16_t attributeCount;
    /**
     * Total size of non-external, non-singleton attribute for this cluster.
     */
    uint16_t clusterSize;
    /**
     * Mask with additional functionality for cluster. See CLUSTER_MASK
     * macros.
     */
    EmberAfClusterMask mask;

    /**
     * An array into the cluster functions. The length of the array
     * is determined by the function bits in mask. This may be null
     * if this cluster has no functions.
     */
    const EmberAfGenericClusterFunction * functions;

    /**
     * A list of client generated commands. A client generated command
     * is a client to server command. Can be nullptr or terminated by 0xFFFF_FFFF.
     */
    const chip::CommandId * acceptedCommandList;

    /**
     * A list of server generated commands. A server generated command
     * is a response to client command request. Can be nullptr or terminated by 0xFFFF_FFFF.
     */
    const chip::CommandId * generatedCommandList;
} EmberAfCluster;

/**
 * @brief Struct that represents a logical device type consisting
 * of a DeviceID and its version.
 */
typedef struct
{
    uint16_t deviceId;
    uint8_t deviceVersion;
} EmberAfDeviceType;

/**
 * @brief Struct used to find an attribute in storage. Together the elements
 * in this search record constitute the "primary key" used to identify a unique
 * attribute value in attribute storage.
 */
typedef struct
{
    /**
     * Endpoint that the attribute is located on
     */
    chip::EndpointId endpoint;

    /**
     * Cluster that the attribute is located on.
     */
    chip::ClusterId clusterId;

    /**
     * The identifier for the attribute.
     */
    chip::AttributeId attributeId;
} EmberAfAttributeSearchRecord;

/**
 * This type is used to compare two ZCL attribute values. The size of this data
 * type depends on the platform.
 */
#ifdef HAL_HAS_INT64
typedef uint64_t EmberAfDifferenceType;
#else
typedef uint32_t EmberAfDifferenceType;
#endif

/**
 * @brief a struct containing the superset of values
 * passed to both emberIncomingMessageHandler on the SOC and
 * ezspIncomingMessageHandler on the host.
 */
typedef struct
{
    /**
     * The type of the incoming message
     */
    EmberIncomingMessageType type;
    /**
     * APS frame for the incoming message
     */
    EmberApsFrame * apsFrame;
    /**
     * The message copied into a flat buffer
     */
    uint8_t * message;
    /**
     * Length of the incoming message
     */
    uint16_t msgLen;
    /**
     * Two byte node id of the sending node.
     */
    uint16_t source;
    /**
     * Link quality from the node that last relayed
     * the message.
     */
    uint8_t lastHopLqi;
    /**
     * The energy level (in units of dBm) observed during the reception.
     */
    int8_t lastHopRssi;
    /**
     * The index of a binding that matches the message
     * or 0xFF if there is no matching binding.
     */
    uint8_t bindingTableIndex;
    /**
     * The index of the entry in the address table
     * that matches the sender of the message or 0xFF
     * if there is no matching entry.
     */
    uint8_t addressTableIndex;
    /**
     * The index of the network on which this message was received.
     */
    uint8_t networkIndex;
} EmberAfIncomingMessage;

/**
 * @brief Interpan Message type: unicast, broadcast, or multicast.
 */
typedef uint8_t EmberAfInterpanMessageType;
#define EMBER_AF_INTER_PAN_UNICAST 0x00
#define EMBER_AF_INTER_PAN_BROADCAST 0x08
#define EMBER_AF_INTER_PAN_MULTICAST 0x0C

// Legacy names
#define INTER_PAN_UNICAST EMBER_AF_INTER_PAN_UNICAST
#define INTER_PAN_BROADCAST EMBER_AF_INTER_PAN_BROADCAST
#define INTER_PAN_MULTICAST EMBER_AF_INTER_PAN_MULTICAST

#define EMBER_AF_INTERPAN_OPTION_NONE 0x0000
#define EMBER_AF_INTERPAN_OPTION_APS_ENCRYPT 0x0001
#define EMBER_AF_INTERPAN_OPTION_MAC_HAS_LONG_ADDRESS 0x0002

/**
 * @brief The options for sending/receiving interpan messages.
 */
typedef uint16_t EmberAfInterpanOptions;

/**
 * @brief Interpan header used for sending and receiving interpan
 *   messages.
 */
typedef struct
{
    EmberAfInterpanMessageType messageType;

    /**
     * MAC addressing
     * For outgoing messages this is the destination.  For incoming messages
     * it is the source, which always has a long address.
     */
    EmberEUI64 longAddress;
    EmberNodeId shortAddress;
    EmberPanId panId;

    /**
     * APS data
     */
    chip::ClusterId clusterId;
    /**
     * The groupId is only used for
     * EMBER_AF_INTERPAN_MULTICAST
     */
    chip::GroupId groupId;
    EmberAfInterpanOptions options;
} EmberAfInterpanHeader;

// Legacy Name
#define InterPanHeader EmberAfInterpanHeader

/**
 * @brief The options for what interpan messages are allowed.
 */
typedef uint8_t EmberAfAllowedInterpanOptions;

#define EMBER_AF_INTERPAN_DIRECTION_CLIENT_TO_SERVER 0x01
#define EMBER_AF_INTERPAN_DIRECTION_SERVER_TO_CLIENT 0x02
#define EMBER_AF_INTERPAN_DIRECTION_BOTH 0x03
#define EMBER_AF_INTERPAN_GLOBAL_COMMAND 0x04
#define EMBER_AF_INTERPAN_MANUFACTURER_SPECIFIC 0x08

/**
 * @brief This structure is used define an interpan message that
 *   will be accepted by the interpan filters.
 */
typedef struct
{
    chip::ClusterId clusterId;
    chip::CommandId commandId;
    EmberAfAllowedInterpanOptions options;
} EmberAfAllowedInterPanMessage;

/**
 * @brief The EmberAFClusterCommand is a struct wrapper
 *   for all the data pertaining to a command which comes
 *   in over the air. This enables struct is used to
 *   encapsulate a command in a single place on the stack
 *   and pass a pointer to that location around during
 *   command processing
 */
struct EmberAfClusterCommand
{
    chip::NodeId SourceNodeId() const { return source->GetSessionHandle()->AsSecureSession()->GetPeerNodeId(); }

    /**
     * APS frame for the incoming message
     */
    EmberApsFrame * apsFrame;
    EmberIncomingMessageType type;
    chip::Messaging::ExchangeContext * source;
    uint8_t * buffer;
    uint16_t bufLen;
    bool clusterSpecific;
    bool mfgSpecific;
    uint16_t mfgCode;
    uint8_t seqNum;
    chip::CommandId commandId;
    uint8_t payloadStartIndex;
    uint8_t direction;
    EmberAfInterpanHeader * interPanHeader;
    uint8_t networkIndex;
};

/**
 * @brief Endpoint type struct describes clusters that are on the endpoint.
 */
typedef struct
{
    /**
     * Pointer to the cluster structs, describing clusters on this
     * endpoint type.
     */
    const EmberAfCluster * cluster;
    /**
     * Number of clusters in this endpoint type.
     */
    uint8_t clusterCount;
    /**
     * Size of all non-external, non-singlet attribute in this endpoint type.
     */
    uint16_t endpointSize;
} EmberAfEndpointType;

#ifdef EZSP_HOST
typedef EzspDecisionId EmberAfTcLinkKeyRequestPolicy;
typedef EzspDecisionId EmberAfAppLinkKeyRequestPolicy;
#define EMBER_AF_ALLOW_TC_KEY_REQUESTS EZSP_ALLOW_TC_KEY_REQUESTS_AND_SEND_CURRENT_KEY
#define EMBER_AF_DENY_TC_KEY_REQUESTS EZSP_DENY_TC_KEY_REQUESTS
#define EMBER_AF_ALLOW_APP_KEY_REQUESTS EZSP_ALLOW_APP_KEY_REQUESTS
#define EMBER_AF_DENY_APP_KEY_REQUESTS EZSP_DENY_APP_KEY_REQUESTS
#else
typedef EmberTcLinkKeyRequestPolicy EmberAfTcLinkKeyRequestPolicy;
typedef EmberAppLinkKeyRequestPolicy EmberAfAppLinkKeyRequestPolicy;
#define EMBER_AF_ALLOW_TC_KEY_REQUESTS EMBER_ALLOW_TC_LINK_KEY_REQUEST_AND_SEND_CURRENT_KEY
#define EMBER_AF_DENY_TC_KEY_REQUESTS EMBER_DENY_TC_LINK_KEY_REQUESTS
#define EMBER_AF_ALLOW_APP_KEY_REQUESTS EMBER_ALLOW_APP_LINK_KEY_REQUEST
#define EMBER_AF_DENY_APP_KEY_REQUESTS EMBER_DENY_APP_LINK_KEY_REQUESTS
#endif

#ifdef DOXYGEN_SHOULD_SKIP_THIS
enum EmberAfEndpointBitmask;
#else
typedef uint8_t EmberAfEndpointBitmask;
enum
#endif
{ EMBER_AF_ENDPOINT_DISABLED = 0x00,
  EMBER_AF_ENDPOINT_ENABLED  = 0x01,
};

/**
 * @brief Struct that maps actual endpoint type, onto a specific endpoint.
 */
struct EmberAfDefinedEndpoint
{
    /**
     * Actual zigbee endpoint number.
     */
    chip::EndpointId endpoint = chip::kInvalidEndpointId;

    /**
     * Span pointing to a list of supported device types
     */
    chip::Span<const EmberAfDeviceType> deviceTypeList;

    /**
     * Meta-data about the endpoint
     */
    EmberAfEndpointBitmask bitmask = EMBER_AF_ENDPOINT_DISABLED;
    /**
     * Endpoint type for this endpoint.
     */
    const EmberAfEndpointType * endpointType = nullptr;
    /**
     * Pointer to the DataVersion storage for the server clusters on this
     * endpoint
     */
    chip::DataVersion * dataVersions = nullptr;

    /**
     * Root endpoint id for composed device type.
     */
    chip::EndpointId parentEndpointId = chip::kInvalidEndpointId;
};

// Cluster specific types

/**
 * @brief Bitmask data type for storing one bit of information for each ESI in
 * the ESI table.
 */
#if (EMBER_AF_PLUGIN_ESI_MANAGEMENT_ESI_TABLE_SIZE <= 8)
typedef uint8_t EmberAfPluginEsiManagementBitmask;
#elif (EMBER_AF_PLUGIN_ESI_MANAGEMENT_ESI_TABLE_SIZE <= 16)
typedef uint16_t EmberAfPluginEsiManagementBitmask;
#elif (EMBER_AF_PLUGIN_ESI_MANAGEMENT_ESI_TABLE_SIZE <= 32)
typedef uint32_t EmberAfPluginEsiManagementBitmask;
#else
#error "EMBER_AF_PLUGIN_ESI_MANAGEMENT_ESI_TABLE_SIZE cannot exceed 32"
#endif

/**
 * @brief Struct that describes a load control event.
 *
 * This is used in the load control event callback and
 * within the demand response load control cluster code.
 */
typedef struct
{
    uint32_t eventId;
#ifdef EMBER_AF_PLUGIN_DRLC_SERVER
    EmberEUI64 source;
    chip::EndpointId sourceEndpoint;
#endif // EMBER_AF_PLUGIN_DRLC_SERVER

#ifdef EMBER_AF_PLUGIN_DRLC
    EmberAfPluginEsiManagementBitmask esiBitmask;
#endif // EMBER_AF_PLUGIN_DRLC

    chip::EndpointId destinationEndpoint;
    uint16_t deviceClass;
    uint8_t utilityEnrollmentGroup;
    /**
     * Start time in seconds
     */
    uint32_t startTime;
    /**
     * Duration in minutes
     */
    uint16_t duration;
    uint8_t criticalityLevel;
    uint8_t coolingTempOffset;
    uint8_t heatingTempOffset;
    int16_t coolingTempSetPoint;
    int16_t heatingTempSetPoint;
    int8_t avgLoadPercentage;
    uint8_t dutyCycle;
    uint8_t eventControl;
    uint32_t startRand;
    uint32_t durationRand;
    uint8_t optionControl;
} EmberAfLoadControlEvent;

/**
 * @brief This is an enum used to indicate the result of the
 *   service discovery.  Unicast discoveries are completed
 *   as soon as a response is received.  Broadcast discoveries
 *   wait a period of time for multiple responses to be received.
 */
typedef enum
{
    EMBER_AF_BROADCAST_SERVICE_DISCOVERY_COMPLETE                     = 0x00,
    EMBER_AF_BROADCAST_SERVICE_DISCOVERY_RESPONSE_RECEIVED            = 0x01,
    EMBER_AF_UNICAST_SERVICE_DISCOVERY_TIMEOUT                        = 0x02,
    EMBER_AF_UNICAST_SERVICE_DISCOVERY_COMPLETE_WITH_RESPONSE         = 0x03,
    EMBER_AF_BROADCAST_SERVICE_DISCOVERY_COMPLETE_WITH_RESPONSE       = 0x04,
    EMBER_AF_UNICAST_SERVICE_DISCOVERY_COMPLETE_WITH_EMPTY_RESPONSE   = 0x05,
    EMBER_AF_BROADCAST_SERVICE_DISCOVERY_COMPLETE_WITH_EMPTY_RESPONSE = 0x06,
} EmberAfServiceDiscoveryStatus;

#define EM_AF_DISCOVERY_RESPONSE_MASK (0x05)

/**
 * @brief A simple way to determine if the service discovery callback
 *   has a response.
 */
#define emberAfHaveDiscoveryResponseStatus(status) ((status) &EM_AF_DISCOVERY_RESPONSE_MASK)

/**
 * @brief A structure containing general information about the service discovery.
 */
typedef struct
{
    /**
     * The status indicates both the type of request (broadcast or unicast)
     * and whether a response has been received.
     */
    EmberAfServiceDiscoveryStatus status;

    /**
     * This indicates what ZDO request cluster was associated with the request.
     * It is helpful for a callback that may be used for multiple ZDO request types
     * to determine the type of data returned.  This will be based on the
     * ZDO cluster values defined in ember-types.h.
     */
    uint16_t zdoRequestClusterId;

    /**
     * This is the address of the device that matched the request, which may
     * be different than the device that *actually* is responding.  This occurs
     * when parents respond on behalf of their children.
     */
    EmberNodeId matchAddress;

    /**
     * Only if the status code indicates a response will this data be non-NULL.
     * When there is data, the type is according to the ZDO cluster ID sent out.
     * For NETWORK_ADDRESS_REQUEST or IEEE_ADDRESS_REQUEST, the long ID will
     * be contained in the responseData,  so it will be a value of type ::EmberEUI64.
     * The short ID will be in the matchAddress parameter field.
     * For the MATCH_DESCRIPTORS_REQUEST the responseData will point
     * to an ::EmberAfEndpointList structure.
     */
    const void * responseData;
} EmberAfServiceDiscoveryResult;

/**
 * @brief A list of endpoints received during a service discovery attempt.
 *   This will be returned for a match descriptor request and a
 *   active endpoint request.
 */
typedef struct
{
    uint8_t count;
    const chip::EndpointId * list;
} EmberAfEndpointList;

/**
 * @brief A list of clusters received during a service discovery attempt.
 * This will be returned for a simple descriptor request.
 */
typedef struct
{
    uint8_t inClusterCount;
    const chip::ClusterId * inClusterList;
    uint8_t outClusterCount;
    const chip::ClusterId * outClusterList;
    uint16_t deviceId;
    chip::EndpointId endpoint;
} EmberAfClusterList;

/**
 * @brief This defines a callback where a code element or cluster can be informed
 * as to the result of a service discovery they have requested.
 * For each match, the callback is fired with all the resulting matches from
 * that source.  If the discovery was unicast to a specific device, then
 * the callback will only be fired once with either MATCH_FOUND or COMPLETE
 * (no matches found).  If the discovery is broadcast then multiple callbacks
 * may be fired with ::EMBER_AF_SERVICE_DISCOVERY_RESPONSE_RECEIVED.
 * After a couple seconds the callback will then be fired with
 * ::EMBER_AF_SERVICE_DISCOVERY_COMPLETE as the result.
 */
typedef void(EmberAfServiceDiscoveryCallback)(const EmberAfServiceDiscoveryResult * result);

/**
 * @brief This defines a callback where a code element or cluster can be
 * informed as to the result of a request to initiate a partner link key
 * exchange.  The callback will be triggered with success equal to true if the
 * exchange completed successfully.
 */
typedef void(EmberAfPartnerLinkKeyExchangeCallback)(bool success);

/**
 * @brief This is an enum used to control how the device will poll for a given
 * active cluster-related event.  When the event is scheduled, the application
 * can pass a poll control value which will be stored along with the event.
 * The processor is only allowed to poll according to the most restrictive
 * value for all active event.  For instance, if two events are active, one
 * with EMBER_AF_LONG_POLL and the other with EMBER_AF_SHORT_POLL, then the
 * processor will short poll until the second event is deactivated.
 */
typedef enum
{
    EMBER_AF_LONG_POLL,
    EMBER_AF_SHORT_POLL,
} EmberAfEventPollControl;

/**
 * @brief This is an enum used to control how the device
 *        will sleep for a given active cluster related event.
 *        When the event is scheduled, the scheduling code can
 *        pass a sleep control value which will be stored along
 *        with the event. The processor is only allowed to sleep
 *        according to the most restrictive sleep control value
 *        for any active event. For instance, if two events
 *        are active, one with EMBER_AF_OK_TO_HIBERNATE and the
 *        other with EMBER_AF_OK_TO_NAP, then the processor
 *        will only be allowed to nap until the second event
 *        is deactivated.
 */
typedef enum
{
    EMBER_AF_OK_TO_SLEEP,
    /** deprecated. */
    EMBER_AF_OK_TO_HIBERNATE = EMBER_AF_OK_TO_SLEEP,
    /** deprecated. */
    EMBER_AF_OK_TO_NAP,
    EMBER_AF_STAY_AWAKE,
} EmberAfEventSleepControl;

/**
 * @brief An enum used to track the tasks that the Application
 * framework cares about. These are intended to be tasks
 * that should keep the device out of hibernation like an
 * application level request / response. If the response does
 * not come in as a data ack, then the application will need
 * to stay out of hibernation to wait and poll for it.
 *
 * Of course some tasks do not necessarily have a response. For
 * instance, a ZDO request may or may not have a response. In this
 * case, the application framework cannot rely on the fact that
 * a response will come in to end the wake cycle, so the Application
 * framework must timeout the wake cycle if no expected
 * response is received or no other event can be relied upon to
 * end the wake cycle.
 *
 * Tasks of this type should be added to the wake timeout mask
 * by calling ::emberAfSetWakeTimeoutBitmaskCallback so that they
 * can be governed by a timeout instead of a request / response
 *
 * the current tasks bitmask is an uint32_t bitmask used to
 * track which tasks are active at any given time. The bottom 16 bits,
 * values 0x01 - 0x8000 are reserved for Ember's use. The top
 * 16 bits are reserved for the customer, values 0x10000 -
 * 0x80000000
 */
#ifdef DOXYGEN_SHOULD_SKIP_THIS
enum EmberAfApplicationTask
#else
typedef uint32_t EmberAfApplicationTask;
enum
#endif
{
    // we may be able to remove these top two since they are
    // handled by the stack on the SOC.
    EMBER_AF_WAITING_FOR_DATA_ACK                     = 0x00000001, // not needed?
    EMBER_AF_LAST_POLL_GOT_DATA                       = 0x00000002, // not needed?
    EMBER_AF_WAITING_FOR_SERVICE_DISCOVERY            = 0x00000004,
    EMBER_AF_WAITING_FOR_ZDO_RESPONSE                 = 0x00000008,
    EMBER_AF_WAITING_FOR_ZCL_RESPONSE                 = 0x00000010,
    EMBER_AF_WAITING_FOR_REGISTRATION                 = 0x00000020,
    EMBER_AF_WAITING_FOR_PARTNER_LINK_KEY_EXCHANGE    = 0x00000040,
    EMBER_AF_FORCE_SHORT_POLL                         = 0x00000080,
    EMBER_AF_FRAGMENTATION_IN_PROGRESS                = 0x00000100,
    EMBER_AF_FORCE_SHORT_POLL_FOR_PARENT_CONNECTIVITY = 0x00000200,
};

/**
 * @brief a structure used to keep track of cluster related events and
 * their sleep control values. The cluster code will not know at
 * runtime all of the events that it has access to in the event table
 * This structure is stored by the application framework in an event
 * context table which along with helper functions allows the cluster
 * code to schedule and deactivate its associated events.
 */
typedef struct
{
    /**
     * The endpoint of the associated cluster event.
     */
    chip::EndpointId endpoint;
    /**
     * The cluster id of the associated cluster event.
     */
    chip::ClusterId clusterId;
    /**
     * The server/client identity of the associated cluster event.
     */
    bool isClient;
    /**
     * A poll control value used to control the network polling behavior while
     * the event is active.
     */
    EmberAfEventPollControl pollControl;
    /**
     * A sleep control value used to control the processor's sleep
     * behavior while the event is active.
     */
    EmberAfEventSleepControl sleepControl;
    /**
     * A pointer to the event control value which is stored in the event table
     * and is used to actually schedule the event.
     */
    EmberEventControl * eventControl;
} EmberAfEventContext;

/**
 * @brief Type for referring to the handler for network events.
 */
typedef void (*EmberAfNetworkEventHandler)(void);

/**
 * @brief Type for referring to the handler for endpoint events.
 */
typedef void (*EmberAfEndpointEventHandler)(chip::EndpointId endpoint);

/**
 * @brief Indicates the absence of a Scene table entry.
 */
#define EMBER_AF_SCENE_TABLE_NULL_INDEX 0xFF
/**
 * @brief Value used when setting or getting the endpoint in a Scene table
 * entry.  It indicates that the entry is not in use.
 */
#define EMBER_AF_SCENE_TABLE_UNUSED_ENDPOINT_ID 0x00
/**
 * @brief Maximum length of Scene names, not including the length byte.
 */
#define ZCL_SCENES_CLUSTER_MAXIMUM_NAME_LENGTH 16
/**
 * @brief The group identifier for the global scene.
 */
#define ZCL_SCENES_GLOBAL_SCENE_GROUP_ID 0x0000
/**
 * @brief The scene identifier for the global scene.
 */
#define ZCL_SCENES_GLOBAL_SCENE_SCENE_ID 0x00
/**
 * @brief A structure used to store scene table entries in RAM or in storage,
 * depending on a plugin setting.  If endpoint field is
 * ::EMBER_AF_SCENE_TABLE_UNUSED_ENDPOINT_ID, the entry is unused.
 */
typedef struct
{
    chip::EndpointId endpoint; // 0x00 when this record is not in use
    chip::GroupId groupId;     // 0x0000 if not associated with a group
    uint8_t sceneId;
#if defined(MATTER_CLUSTER_SCENE_NAME_SUPPORT) && MATTER_CLUSTER_SCENE_NAME_SUPPORT
    uint8_t name[ZCL_SCENES_CLUSTER_MAXIMUM_NAME_LENGTH + 1];
#endif
    uint16_t transitionTime;     // in seconds
    uint8_t transitionTime100ms; // in tenths of a seconds
#ifdef ZCL_USING_ON_OFF_CLUSTER_SERVER
    bool hasOnOffValue;
    bool onOffValue;
#endif
#ifdef ZCL_USING_LEVEL_CONTROL_CLUSTER_SERVER
    bool hasCurrentLevelValue;
    uint8_t currentLevelValue;
#endif
#ifdef ZCL_USING_THERMOSTAT_CLUSTER_SERVER
    bool hasOccupiedCoolingSetpointValue;
    int16_t occupiedCoolingSetpointValue;
    bool hasOccupiedHeatingSetpointValue;
    int16_t occupiedHeatingSetpointValue;
    bool hasSystemModeValue;
    uint8_t systemModeValue;
#endif
#ifdef ZCL_USING_COLOR_CONTROL_CLUSTER_SERVER
    bool hasCurrentXValue;
    uint16_t currentXValue;
    bool hasCurrentYValue;
    uint16_t currentYValue;
    bool hasEnhancedCurrentHueValue;
    uint16_t enhancedCurrentHueValue;
    bool hasCurrentSaturationValue;
    uint8_t currentSaturationValue;
    bool hasColorLoopActiveValue;
    uint8_t colorLoopActiveValue;
    bool hasColorLoopDirectionValue;
    uint8_t colorLoopDirectionValue;
    bool hasColorLoopTimeValue;
    uint16_t colorLoopTimeValue;
    bool hasColorTemperatureMiredsValue;
    uint16_t colorTemperatureMiredsValue;
#endif // ZCL_USING_COLOR_CONTROL_CLUSTER_SERVER
#ifdef ZCL_USING_DOOR_LOCK_CLUSTER_SERVER
    bool hasLockStateValue;
    uint8_t lockStateValue;
#endif
#ifdef ZCL_USING_WINDOW_COVERING_CLUSTER_SERVER
    bool hasCurrentPositionLiftPercentageValue;
    uint8_t currentPositionLiftPercentageValue;
    bool hasCurrentPositionTiltPercentageValue;
    uint8_t currentPositionTiltPercentageValue;
    bool hasTargetPositionLiftPercent100thsValue;
    uint16_t targetPositionLiftPercent100thsValue;
    bool hasTargetPositionTiltPercent100thsValue;
    uint16_t targetPositionTiltPercent100thsValue;
#endif
} EmberAfSceneTableEntry;

#if !defined(EMBER_AF_PLUGIN_MESSAGING_CLIENT)
// In order to be able to forward declare callbacks regardless of whether the plugin
// is enabled, we need to define all data structures.  In order to be able to define
// the messaging client data struct, we need to declare this variable.
#define EMBER_AF_PLUGIN_MESSAGING_CLIENT_MESSAGE_SIZE 0
#endif

typedef struct
{
    bool valid;
    bool active;
    EmberAfPluginEsiManagementBitmask esiBitmask;
    chip::EndpointId clientEndpoint;
    uint32_t messageId;
    uint8_t messageControl;
    uint32_t startTime;
    uint32_t endTime;
    uint16_t durationInMinutes;
    uint8_t message[EMBER_AF_PLUGIN_MESSAGING_CLIENT_MESSAGE_SIZE + 1];
} EmberAfPluginMessagingClientMessage;

#define ZCL_PRICE_CLUSTER_MAXIMUM_RATE_LABEL_LENGTH 11
typedef struct
{
    bool valid;
    bool active;
    chip::EndpointId clientEndpoint;
    uint32_t providerId;
    uint8_t rateLabel[ZCL_PRICE_CLUSTER_MAXIMUM_RATE_LABEL_LENGTH + 1];
    uint32_t issuerEventId;
    uint32_t currentTime;
    uint8_t unitOfMeasure;
    uint16_t currency;
    uint8_t priceTrailingDigitAndPriceTier;
    uint8_t numberOfPriceTiersAndRegisterTier;
    uint32_t startTime;
    uint32_t endTime;
    uint16_t durationInMinutes;
    uint32_t price;
    uint8_t priceRatio;
    uint32_t generationPrice;
    uint8_t generationPriceRatio;
    uint32_t alternateCostDelivered;
    uint8_t alternateCostUnit;
    uint8_t alternateCostTrailingDigit;
    uint8_t numberOfBlockThresholds;
    uint8_t priceControl;
} EmberAfPluginPriceClientPrice;

/**
 * @brief Specifies CPP Authorization values
 */
#ifdef DOXYGEN_SHOULD_SKIP_THIS
enum EmberAfPluginPriceCppAuth
#else
typedef uint8_t EmberAfPluginPriceCppAuth;
enum
#endif
{
    EMBER_AF_PLUGIN_PRICE_CPP_AUTH_PENDING  = 0,
    EMBER_AF_PLUGIN_PRICE_CPP_AUTH_ACCEPTED = 1,
    EMBER_AF_PLUGIN_PRICE_CPP_AUTH_REJECTED = 2,
    EMBER_AF_PLUGIN_PRICE_CPP_AUTH_FORCED   = 3,
    EMBER_AF_PLUGIN_PRICE_CPP_AUTH_RESERVED = 4
};

typedef enum
{
    EMBER_AF_PLUGIN_TUNNELING_CLIENT_SUCCESS                          = 0x00,
    EMBER_AF_PLUGIN_TUNNELING_CLIENT_BUSY                             = 0x01,
    EMBER_AF_PLUGIN_TUNNELING_CLIENT_NO_MORE_TUNNEL_IDS               = 0x02,
    EMBER_AF_PLUGIN_TUNNELING_CLIENT_PROTOCOL_NOT_SUPPORTED           = 0x03,
    EMBER_AF_PLUGIN_TUNNELING_CLIENT_FLOW_CONTROL_NOT_SUPPORTED       = 0x04,
    EMBER_AF_PLUGIN_TUNNELING_CLIENT_IEEE_ADDRESS_REQUEST_FAILED      = 0xF9,
    EMBER_AF_PLUGIN_TUNNELING_CLIENT_IEEE_ADDRESS_NOT_FOUND           = 0xFA,
    EMBER_AF_PLUGIN_TUNNELING_CLIENT_ADDRESS_TABLE_FULL               = 0xFB,
    EMBER_AF_PLUGIN_TUNNELING_CLIENT_LINK_KEY_EXCHANGE_REQUEST_FAILED = 0xFC,
    EMBER_AF_PLUGIN_TUNNELING_CLIENT_LINK_KEY_EXCHANGE_FAILED         = 0xFD,
    EMBER_AF_PLUGIN_TUNNELING_CLIENT_REQUEST_TUNNEL_FAILED            = 0xFE,
    EMBER_AF_PLUGIN_TUNNELING_CLIENT_REQUEST_TUNNEL_TIMEOUT           = 0xFF,
} EmberAfPluginTunnelingClientStatus;

#ifdef EMBER_AF_PLUGIN_ZLL_COMMISSIONING_COMMON
/**
 * @brief Status codes used by the ZLL Commissioning plugin.
 */
#ifdef DOXYGEN_SHOULD_SKIP_THIS
enum EmberAfZllCommissioningStatus
#else
typedef uint8_t EmberAfZllCommissioningStatus;
enum
#endif
{
    EMBER_AF_ZLL_ABORTED_BY_APPLICATION                      = 0x00,
    EMBER_AF_ZLL_CHANNEL_CHANGE_FAILED                       = 0x01,
    EMBER_AF_ZLL_JOINING_FAILED                              = 0x02,
    EMBER_AF_ZLL_NO_NETWORKS_FOUND                           = 0x03,
    EMBER_AF_ZLL_PREEMPTED_BY_STACK                          = 0x04,
    EMBER_AF_ZLL_SENDING_START_JOIN_FAILED                   = 0x05,
    EMBER_AF_ZLL_SENDING_DEVICE_INFORMATION_REQUEST_FAILED   = 0x06,
    EMBER_AF_ZLL_SENDING_IDENTIFY_REQUEST_FAILED             = 0x07,
    EMBER_AF_ZLL_SENDING_RESET_TO_FACTORY_NEW_REQUEST_FAILED = 0x08,
    EMBER_AF_ZLL_NETWORK_FORMATION_FAILED                    = 0x09,
    EMBER_AF_ZLL_NETWORK_UPDATE_OPERATION                    = 0x0A,
};

/**
 * @brief A structure used to represent Group Information Records used by ZLL
 * Commissioning.
 */
typedef struct
{
    chip::GroupId groupId;
    uint8_t groupType;
} EmberAfPluginZllCommissioningGroupInformationRecord;

/**
 * @brief A structure used to represent Endpoint Information Records used by
 * ZLL Commissioning.
 */
typedef struct
{
    EmberNodeId networkAddress;
    chip::EndpointId endpointId;
    uint16_t deviceId;
    uint8_t version;
} EmberAfPluginZllCommissioningEndpointInformationRecord;
#endif

typedef enum
{
    NO_APP_MESSAGE               = 0,
    RECEIVED_PARTNER_CERTIFICATE = 1,
    GENERATING_EPHEMERAL_KEYS    = 2,
    GENERATING_SHARED_SECRET     = 3,
    KEY_GENERATION_DONE          = 4,
    GENERATE_SHARED_SECRET_DONE  = 5,
    /**
     * LINK_KEY_ESTABLISHED indicates Success,
     * key establishment done.
     */
    LINK_KEY_ESTABLISHED = 6,

    /**
     * Error codes:
     * Transient failures where Key Establishment could be retried
     */
    NO_LOCAL_RESOURCES                  = 7,
    PARTNER_NO_RESOURCES                = 8,
    TIMEOUT_OCCURRED                    = 9,
    INVALID_APP_COMMAND                 = 10,
    MESSAGE_SEND_FAILURE                = 11,
    PARTNER_SENT_TERMINATE              = 12,
    INVALID_PARTNER_MESSAGE             = 13,
    PARTNER_SENT_DEFAULT_RESPONSE_ERROR = 14,

    /**
     * Fatal Errors:
     * These results are not worth retrying because the outcome
     * will not change
     */
    BAD_CERTIFICATE_ISSUER      = 15,
    KEY_CONFIRM_FAILURE         = 16,
    BAD_KEY_ESTABLISHMENT_SUITE = 17,

    KEY_TABLE_FULL = 18,

    /**
     * Neither initiator nor responder is an
     * ESP/TC so the key establishment is not
     * allowed per the spec.
     */
    NO_ESTABLISHMENT_ALLOWED = 19,

    /* 283k1 certificates need to have valid key usage
     */
    INVALID_CERTIFICATE_KEY_USAGE = 20,
} EmberAfKeyEstablishmentNotifyMessage;

#define APP_NOTIFY_ERROR_CODE_START NO_LOCAL_RESOURCES
#define APP_NOTIFY_MESSAGE_TEXT                                                                                                    \
    {                                                                                                                              \
        "None", "Received Cert", "Generate keys", "Generate secret", "Key generate done", "Generate secret done",                  \
            "Link key verified",                                                                                                   \
                                                                                                                                   \
            /* Transient Error codes */                                                                                            \
            "No local resources", "Partner no resources", "Timeout", "Invalid app. command", "Message send failure",               \
            "Partner sent terminate", "Bad message", "Partner sent Default Rsp",                                                   \
                                                                                                                                   \
            /* Fatal errors */                                                                                                     \
            "Bad cert issuer", "Key confirm failure", "Bad key est. suite", "Key table full", "Not allowed", "Invalid Key Usage",  \
    }

/**
 * @brief Type for referring to the tick callback for cluster.
 *
 * Tick function will be called once for each tick for each endpoint in
 * the cluster. The rate of tick is determined by the metadata of the
 * cluster.
 */
typedef void (*EmberAfTickFunction)(chip::EndpointId endpoint);

/**
 * @brief Type for referring to the init callback for cluster.
 *
 * Init function is called when the application starts up, once for
 * each cluster/endpoint combination.
 */
typedef void (*EmberAfInitFunction)(chip::EndpointId endpoint);

/**
 * @brief Type for referring to the attribute changed callback function.
 *
 * This function is called just after an attribute changes.
 */
typedef void (*EmberAfClusterAttributeChangedCallback)(const chip::app::ConcreteAttributePath & attributePath);

/**
 * @brief Type for referring to the pre-attribute changed callback function.
 *
 * This function is called before an attribute changes.
 */
typedef EmberAfStatus (*EmberAfClusterPreAttributeChangedCallback)(const chip::app::ConcreteAttributePath & attributePath,
                                                                   EmberAfAttributeType attributeType, uint16_t size,
                                                                   uint8_t * value);

/**
 * @brief Type for referring to the default response callback function.
 *
 * This function is called when default response is received, before
 * the global callback. Global callback is called immediately afterwards.
 */
typedef void (*EmberAfDefaultResponseFunction)(chip::EndpointId endpoint, chip::CommandId commandId, EmberAfStatus status);

namespace chip {
/**
 * @brief a type that represents where we are trying to send a message.
 *        The variant type identifies which arm of the union is in use.
 */
class MessageSendDestination
{
public:
    MessageSendDestination(MessageSendDestination & that)       = default;
    MessageSendDestination(const MessageSendDestination & that) = default;
    MessageSendDestination(MessageSendDestination && that)      = default;

    static MessageSendDestination ViaBinding(uint8_t bindingIndex)
    {
        return MessageSendDestination(VariantViaBinding(bindingIndex));
    }

    static MessageSendDestination Direct(NodeId nodeId) { return MessageSendDestination(VariantDirect(nodeId)); }

    static MessageSendDestination Multicast(GroupId groupId) { return MessageSendDestination(VariantMulticast(groupId)); }

    static MessageSendDestination MulticastWithAlias(GroupId groupId)
    {
        return MessageSendDestination(VariantMulticastWithAlias(groupId));
    }

    static MessageSendDestination ViaExchange(Messaging::ExchangeContext * exchangeContext)
    {
        return MessageSendDestination(VariantViaExchange(exchangeContext));
    }

    bool IsViaBinding() const { return mDestination.Is<VariantViaBinding>(); }
    bool IsDirect() const { return mDestination.Is<VariantDirect>(); }
    bool IsViaExchange() const { return mDestination.Is<VariantViaExchange>(); }

    uint8_t GetBindingIndex() const { return mDestination.Get<VariantViaBinding>().mBindingIndex; }
    NodeId GetDirectNodeId() const { return mDestination.Get<VariantDirect>().mNodeId; }
    Messaging::ExchangeContext * GetExchangeContext() const { return mDestination.Get<VariantViaExchange>().mExchangeContext; }

private:
    struct VariantViaBinding
    {
        explicit VariantViaBinding(uint8_t bindingIndex) : mBindingIndex(bindingIndex) {}
        uint8_t mBindingIndex;
    };

    struct VariantViaAddressTable
    {
    };

    struct VariantDirect
    {
        explicit VariantDirect(NodeId nodeId) : mNodeId(nodeId) {}
        NodeId mNodeId;
    };

    struct VariantMulticast
    {
        explicit VariantMulticast(GroupId groupId) : mGroupId(groupId) {}
        GroupId mGroupId;
    };

    struct VariantMulticastWithAlias
    {
        explicit VariantMulticastWithAlias(GroupId groupId) : mGroupId(groupId) {}
        GroupId mGroupId;
    };

    struct VariantBroadcast
    {
    };

    struct VariantBroadcastWithAlias
    {
    };

    struct VariantViaExchange
    {
        explicit VariantViaExchange(Messaging::ExchangeContext * exchangeContext) : mExchangeContext(exchangeContext) {}
        Messaging::ExchangeContext * mExchangeContext;
    };

    template <typename Destination>
    MessageSendDestination(Destination && destination)
    {
        mDestination.Set<Destination>(std::forward<Destination>(destination));
    }

    Variant<VariantViaBinding, VariantViaAddressTable, VariantDirect, VariantMulticast, VariantMulticastWithAlias, VariantBroadcast,
            VariantBroadcastWithAlias, VariantViaExchange>
        mDestination;
};
} // namespace chip

/**
 * @brief Type for referring to the message sent callback function.
 *
 * This function is called when a message is sent.
 */
typedef void (*EmberAfMessageSentFunction)(const chip::MessageSendDestination & destination, EmberApsFrame * apsFrame,
                                           uint16_t msgLen, uint8_t * message, EmberStatus status);

/**
 * @brief The EmberAfMessageStruct is a struct wrapper that
 *   contains all the data about a low-level message to be
 *   sent (it may be ZCL or may be some other protocol).
 */
typedef struct
{
    EmberAfMessageSentFunction callback;
    EmberApsFrame * apsFrame;
    uint8_t * message;
    const chip::MessageSendDestination destination;
    uint16_t messageLength;
    bool broadcast;
} EmberAfMessageStruct;

/**
 * @brief A data struct for a link key backup.
 *
 * Each entry notes the EUI64 of the device it is paired to and the key data.
 *   This key may be hashed and not the actual link key currently in use.
 */

typedef struct
{
    EmberEUI64 deviceId;
    EmberKeyData key;
} EmberAfLinkKeyBackupData;

/**
 * @brief A data struct for all the trust center backup data.
 *
 * The 'keyList' pointer must point to an array and 'maxKeyListLength'
 * must be populated with the maximum number of entries the array can hold.
 *
 * Functions that modify this data structure will populate 'keyListLength'
 * indicating how many keys were actually written into 'keyList'.
 */

typedef struct
{
    EmberEUI64 extendedPanId;
    uint8_t keyListLength;
    uint8_t maxKeyListLength;
    EmberAfLinkKeyBackupData * keyList;
} EmberAfTrustCenterBackupData;

/**
 * @brief The length of the hardware tag in the Ember Bootloader Query
 *   Response.
 */
#define EMBER_AF_STANDALONE_BOOTLOADER_HARDWARE_TAG_LENGTH 16

/**
 * @brief A data struct for the information retrieved during a response
 *   to an Ember Bootloader over-the-air query.
 */
typedef struct
{
    uint8_t hardwareTag[EMBER_AF_STANDALONE_BOOTLOADER_HARDWARE_TAG_LENGTH];
    uint8_t eui64[EUI64_SIZE];
    uint16_t mfgId;
    uint16_t bootloaderVersion;
    uint8_t capabilities;
    uint8_t platform;
    uint8_t micro;
    uint8_t phy;
    bool bootloaderActive;
} EmberAfStandaloneBootloaderQueryResponseData;

/**
 * @brief A data struct used to keep track of incoming and outgoing
 *   commands for command discovery
 */
typedef struct
{
    uint16_t clusterId;
    chip::CommandId commandId;
    uint8_t mask;
} EmberAfCommandMetadata;

/**
 * @brief A data structure used to describe the time in a human
 * understandable format (as opposed to 32-bit UTC)
 */

typedef struct
{
    uint16_t year;
    uint8_t month;
    uint8_t day;
    uint8_t hours;
    uint8_t minutes;
    uint8_t seconds;
} EmberAfTimeStruct;

/**
 * @brief A data structure used to describe the ZCL Date data type
 */

typedef struct
{
    uint8_t year;
    uint8_t month;
    uint8_t dayOfMonth;
    uint8_t dayOfWeek;
} EmberAfDate;

/* Simple Metering Server Test Code */
#define EMBER_AF_PLUGIN_SIMPLE_METERING_SERVER_ELECTRIC_METER 0
#define EMBER_AF_PLUGIN_SIMPLE_METERING_SERVER_GAS_METER 1

// Functional Notification Flags
// Also #defined in enums.h under slightly different names
#define EMBER_AF_METERING_FNF_NEW_OTA_FIRMWARE 0x00000001
#define EMBER_AF_METERING_FNF_CBKE_UPDATE_REQUEST 0x00000002
#define EMBER_AF_METERING_FNF_TIME_SYNC 0x00000004
#define EMBER_AF_METERING_FNF_STAY_AWAKE_REQUEST_HAN 0x00000010
#define EMBER_AF_METERING_FNF_STAY_AWAKE_REQUEST_WAN 0x00000020
#define EMBER_AF_METERING_FNF_PUSH_HISTORICAL_METERING_DATA_ATTRIBUTE_SET 0x000001C0
#define EMBER_AF_METERING_FNF_PUSH_HISTORICAL_PREPAYMENT_DATA_ATTRIBUTE_SET 0x00000E00
#define EMBER_AF_METERING_FNF_PUSH_ALL_STATIC_DATA_BASIC_CLUSTER 0x00001000
#define EMBER_AF_METERING_FNF_PUSH_ALL_STATIC_DATA_METERING_CLUSTER 0x00002000
#define EMBER_AF_METERING_FNF_PUSH_ALL_STATIC_DATA_PREPAYMENT_CLUSTER 0x00004000
#define EMBER_AF_METERING_FNF_NETWORK_KEY_ACTIVE 0x00008000
#define EMBER_AF_METERING_FNF_DISPLAY_MESSAGE 0x00010000
#define EMBER_AF_METERING_FNF_CANCEL_ALL_MESSAGES 0x00020000
#define EMBER_AF_METERING_FNF_CHANGE_SUPPLY 0x00040000
#define EMBER_AF_METERING_FNF_LOCAL_CHANGE_SUPPLY 0x00080000
#define EMBER_AF_METERING_FNF_SET_UNCONTROLLED_FLOW_THRESHOLD 0x00100000
#define EMBER_AF_METERING_FNF_TUNNEL_MESSAGE_PENDING 0x00200000
#define EMBER_AF_METERING_FNF_GET_SNAPSHOT 0x00400000
#define EMBER_AF_METERING_FNF_GET_SAMPLED_DATA 0x00800000
#define EMBER_AF_METERING_FNF_NEW_SUB_GHZ_CHANNEL_MASKS_AVAILABLE 0x01000000
#define EMBER_AF_METERING_FNF_ENERGY_SCAN_PENDING 0x02000000
#define EMBER_AF_METERING_FNF_CHANNEL_CHANGE_PENDING 0x04000000

// Notification Flags 2
#define EMBER_AF_METERING_NF2_PUBLISH_PRICE 0x00000001
#define EMBER_AF_METERING_NF2_PUBLISH_BLOCK_PERIOD 0x00000002
#define EMBER_AF_METERING_NF2_PUBLISH_TARIFF_INFORMATION 0x00000004
#define EMBER_AF_METERING_NF2_PUBLISH_CONVERSION_FACTOR 0x00000008
#define EMBER_AF_METERING_NF2_PUBLISH_CALORIFIC_VALUE 0x00000010
#define EMBER_AF_METERING_NF2_PUBLISH_CO2_VALUE 0x00000020
#define EMBER_AF_METERING_NF2_PUBLISH_BILLING_PERIOD 0x00000040
#define EMBER_AF_METERING_NF2_PUBLISH_CONSOLIDATED_BILL 0x00000080
#define EMBER_AF_METERING_NF2_PUBLISH_PRICE_MATRIX 0x00000100
#define EMBER_AF_METERING_NF2_PUBLISH_BLOCK_THRESHOLDS 0x00000200
#define EMBER_AF_METERING_NF2_PUBLISH_CURRENCY_CONVERSION 0x00000400
#define EMBER_AF_METERING_NF2_PUBLISH_CREDIT_PAYMENT_INFO 0x00001000
#define EMBER_AF_METERING_NF2_PUBLISH_CPP_EVENT 0x00002000
#define EMBER_AF_METERING_NF2_PUBLISH_TIER_LABELS 0x00004000
#define EMBER_AF_METERING_NF2_CANCEL_TARIFF 0x00008000

// Notification Flags 3
#define EMBER_AF_METERING_NF3_PUBLISH_CALENDAR 0x00000001
#define EMBER_AF_METERING_NF3_PUBLISH_SPECIAL_DAYS 0x00000002
#define EMBER_AF_METERING_NF3_PUBLISH_SEASONS 0x00000004
#define EMBER_AF_METERING_NF3_PUBLISH_WEEK 0x00000008
#define EMBER_AF_METERING_NF3_PUBLISH_DAY 0x00000010
#define EMBER_AF_METERING_NF3_CANCEL_CALENDAR 0x00000020

// Notification Flags 4
#define EMBER_AF_METERING_NF4_SELECT_AVAILABLE_EMERGENCY_CREDIT 0x00000001
#define EMBER_AF_METERING_NF4_CHANGE_DEBT 0x00000002
#define EMBER_AF_METERING_NF4_EMERGENCY_CREDIT_SETUP 0x00000004
#define EMBER_AF_METERING_NF4_CONSUMER_TOP_UP 0x00000008
#define EMBER_AF_METERING_NF4_CREDIT_ADJUSTMENT 0x00000010
#define EMBER_AF_METERING_NF4_CHANGE_PAYMENT_MODE 0x00000020
#define EMBER_AF_METERING_NF4_GET_PREPAY_SNAPSHOT 0x00000040
#define EMBER_AF_METERING_NF4_GET_TOP_UP_LOG 0x00000080
#define EMBER_AF_METERING_NF4_SET_LOW_CREDIT_WARNING_LEVEL 0x00000100
#define EMBER_AF_METERING_NF4_GET_DEBT_REPAYMENT_LOG 0x00000200
#define EMBER_AF_METERING_NF4_SET_MAXIMUM_CREDIT_LIMIT 0x00000400
#define EMBER_AF_METERING_NF4_SET_OVERALL_DEBT_CAP 0x00000800

// Notification Flags 5
#define EMBER_AF_METERING_NF5_PUBLISH_CHANGE_OF_TENANCY 0x00000001
#define EMBER_AF_METERING_NF5_PUBLISH_CHANGE_OF_SUPPLIER 0x00000002
#define EMBER_AF_METERING_NF5_REQUEST_NEW_PASSWORD_1_RESPONSE 0x00000004
#define EMBER_AF_METERING_NF5_REQUEST_NEW_PASSWORD_2_RESPONSE 0x00000008
#define EMBER_AF_METERING_NF5_REQUEST_NEW_PASSWORD_3_RESPONSE 0x00000010
#define EMBER_AF_METERING_NF5_REQUEST_NEW_PASSWORD_4_RESPONSE 0x00000020
#define EMBER_AF_METERING_NF5_UPDATE_SITE_ID 0x00000040
#define EMBER_AF_METERING_NF5_RESET_BATTERY_COUNTER 0x00000080
#define EMBER_AF_METERING_NF5_UPDATE_CIN 0x00000100

/**
 * @brief Device Management plugin types
 */

#define EMBER_AF_DEVICE_MANAGEMENT_MAXIMUM_PROPOSED_PROVIDER_NAME_LENGTH (16)
#define EMBER_AF_DEVICE_MANAGEMENT_MAXIMUM_PROPOSED_PROVIDER_CONTACT_DETAILS_LENGTH (18)
#define EMBER_AF_DEVICE_MANAGEMENT_MAXIMUM_SITE_ID_LENGTH (32)
#define EMBER_AF_DEVICE_MANAGEMENT_MAXIMUM_CIN_LENGTH (24)
#define EMBER_AF_DEVICE_MANAGEMENT_MAXIMUM_PASSWORD_LENGTH (10)

#ifdef DOXYGEN_SHOULD_SKIP_THIS
enum EmberAfDeviceManagementPasswordType
#else
typedef uint16_t EmberAfDeviceManagementPasswordType;
enum
#endif
{
    UNUSED_PASSWORD   = 0x00,
    SERVICE_PASSWORD  = 0x01,
    CONSUMER_PASSWORD = 0x02,
};

#ifdef DOXYGEN_SHOULD_SKIP_THIS
enum EmberAfDeviceManagementChangePendingFlags
#else
typedef uint8_t EmberAfDeviceManagementChangePendingFlags;
enum
#endif
{
    EMBER_AF_DEVICE_MANAGEMENT_CHANGE_OF_TENANCY_PENDING_MASK        = 0x01,
    EMBER_AF_DEVICE_MANAGEMENT_CHANGE_OF_SUPPLIER_PENDING_MASK       = 0x02,
    EMBER_AF_DEVICE_MANAGEMENT_UPDATE_SITE_ID_PENDING_MASK           = 0x04,
    EMBER_AF_DEVICE_MANAGEMENT_UPDATE_CIN_PENDING_MASK               = 0x08,
    EMBER_AF_DEVICE_MANAGEMENT_UPDATE_SERVICE_PASSWORD_PENDING_MASK  = 0x10,
    EMBER_AF_DEVICE_MANAGEMENT_UPDATE_CONSUMER_PASSWORD_PENDING_MASK = 0x20,
};

typedef struct
{
    // Optional fields only used by Gas Proxy Function plugin.
    uint32_t providerId;
    uint32_t issuerEventId;
    uint8_t tariffType;

    // always used fields
    uint32_t implementationDateTime;
    uint32_t tenancy;
} EmberAfDeviceManagementTenancy;

typedef struct
{
    uint32_t proposedProviderId;
    uint32_t implementationDateTime;
    uint32_t providerChangeControl;
    uint8_t proposedProviderName[EMBER_AF_DEVICE_MANAGEMENT_MAXIMUM_PROPOSED_PROVIDER_NAME_LENGTH + 1];
    uint8_t proposedProviderContactDetails[EMBER_AF_DEVICE_MANAGEMENT_MAXIMUM_PROPOSED_PROVIDER_CONTACT_DETAILS_LENGTH + 1];
} EmberAfDeviceManagementSupplier;

typedef struct
{
    uint32_t requestDateTime;
    uint32_t implementationDateTime;
    uint8_t supplyStatus;
    uint8_t originatorIdSupplyControlBits;
} EmberAfDeviceManagementSupply;

typedef struct
{
    uint8_t siteId[EMBER_AF_DEVICE_MANAGEMENT_MAXIMUM_SITE_ID_LENGTH + 1];
    uint32_t implementationDateTime;
    uint32_t issuerEventId;
} EmberAfDeviceManagementSiteId;

typedef struct
{
    uint8_t cin[EMBER_AF_DEVICE_MANAGEMENT_MAXIMUM_CIN_LENGTH + 1];
    uint32_t implementationDateTime;
    uint32_t issuerEventId;
} EmberAfDeviceManagementCIN;

typedef struct
{
    bool supplyTamperState;
    bool supplyDepletionState;
    bool supplyUncontrolledFlowState;
    bool loadLimitSupplyState;
} EmberAfDeviceManagementSupplyStatusFlags;

typedef struct
{
    uint16_t uncontrolledFlowThreshold;
    uint16_t multiplier;
    uint16_t divisor;
    uint16_t measurementPeriod;
    uint8_t unitOfMeasure;
    uint8_t stabilisationPeriod;
} EmberAfDeviceManagementUncontrolledFlowThreshold;

typedef struct
{
    uint32_t implementationDateTime;
    uint8_t supplyStatus;
} EmberAfDeviceManagementSupplyStatus;

typedef struct
{
    uint8_t password[EMBER_AF_DEVICE_MANAGEMENT_MAXIMUM_PASSWORD_LENGTH + 1];
    uint32_t implementationDateTime;
    uint16_t durationInMinutes;
    EmberAfDeviceManagementPasswordType passwordType;
} EmberAfDeviceManagementPassword;

typedef struct
{
    uint8_t startIndex;
    uint8_t endIndex;
} EmberAfDeviceManagementAttributeRange;

// attrRange is a list of attributeId values in a cluster. It's needed to track contigous
// segments of valid attributeId's with gaps in the middle.
// attributeSetId is the value of the upper byte in the attributeId. It ranges from 0x01(Price)
// to 0x08(OTA Event Configuration)
// Eg. {0x00,0x05} and {0x08,0x0A}
// We're betting that there isn't a list of cluster attributes that has more than 5 gaps.
typedef struct
{
    uint8_t attributeSetId;
    EmberAfDeviceManagementAttributeRange attributeRange[7];
} EmberAfDeviceManagementAttributeTable;

typedef struct
{
    bool encryption;

    uint8_t * plainPayload;
    uint16_t plainPayloadLength;

    uint8_t * encryptedPayload;
    uint16_t encryptedPayloadLength;
} EmberAfGbzMessageData;

typedef struct
{
    uint8_t * gbzCommands;
    uint16_t gbzCommandsLength;
    uint8_t * gbzCommandsResponse;
    uint16_t gbzCommandsResponseLength;
    uint16_t messageCode;
} EmberAfGpfMessage;

/**
 * @brief Zigbee Internet Client/Server Remote Cluster Types
 */
typedef uint16_t EmberAfRemoteClusterType;

#define EMBER_AF_REMOTE_CLUSTER_TYPE_NONE 0x0000
#define EMBER_AF_REMOTE_CLUSTER_TYPE_SERVER 0x0001
#define EMBER_AF_REMOTE_CLUSTER_TYPE_CLIENT 0x0002
#define EMBER_AF_REMOTE_CLUSTER_TYPE_INVALID 0xFFFF

/**
 * @brief Zigbee Internet Client/Server remote cluster struct.
 */
typedef struct
{
    chip::ClusterId clusterId;
    uint16_t deviceId;
    chip::EndpointId endpoint;
    EmberAfRemoteClusterType type;
} EmberAfRemoteClusterStruct;

/**
 * @brief Zigbee Internet Client/Server Remote Binding struct
 */
typedef struct
{
    EmberEUI64 targetEUI64;
    chip::EndpointId sourceEndpoint;
    chip::EndpointId destEndpoint;
    chip::ClusterId clusterId;
    EmberEUI64 destEUI64;
    EmberEUI64 sourceEUI64;
} EmberAfRemoteBindingStruct;

typedef struct
{
    chip::ClusterId clusterId;
    bool server;
} EmberAfClusterInfo;

#if !defined(EMBER_AF_MAX_CLUSTERS_PER_ENDPOINT)
#define EMBER_AF_MAX_CLUSTERS_PER_ENDPOINT 3
#endif

/**
 * @brief A struct containing basic information about an endpoint.
 */
typedef struct
{
    EmberAfClusterInfo clusters[EMBER_AF_MAX_CLUSTERS_PER_ENDPOINT];
    uint16_t deviceId;
    chip::EndpointId endpoint;
    uint8_t clusterCount;
} EmberAfEndpointInfoStruct;

#if !defined(EMBER_AF_MAX_ENDPOINTS_PER_DEVICE)
#define EMBER_AF_MAX_ENDPOINTS_PER_DEVICE 1
#endif

// Although we treat this like a bitmap, only 1 bit is set at a time.
// We use the bitmap feature to allow us to find all devices
// with any in a set of status codes using
// emberAfPluginDeviceDatabaseFindDeviceByStatus().
typedef enum
{
    EMBER_AF_DEVICE_DISCOVERY_STATUS_NONE                = 0x00,
    EMBER_AF_DEVICE_DISCOVERY_STATUS_NEW                 = 0x01,
    EMBER_AF_DEVICE_DISCOVERY_STATUS_FIND_ENDPOINTS      = 0x02,
    EMBER_AF_DEVICE_DISCOVERY_STATUS_FIND_CLUSTERS       = 0x04,
    EMBER_AF_DEVICE_DISCOVERY_STATUS_FIND_STACK_REVISION = 0x08,

    EMBER_AF_DEVICE_DISCOVERY_STATUS_DONE   = 0x40,
    EMBER_AF_DEVICE_DISCOVERY_STATUS_FAILED = 0x80,
} EmberAfDeviceDiscoveryStatus;

/**
 * @brief A struct containing endpoint information about a device.
 */
typedef struct
{
    EmberEUI64 eui64;
    EmberAfEndpointInfoStruct endpoints[EMBER_AF_MAX_ENDPOINTS_PER_DEVICE];
    EmberAfDeviceDiscoveryStatus status;
    uint8_t discoveryFailures;
    uint8_t capabilities;
    uint8_t endpointCount;
    uint8_t stackRevision;
} EmberAfDeviceInfo;

typedef struct
{
    uint16_t deviceIndex;
} EmberAfDeviceDatabaseIterator;

typedef struct
{
    EmberNodeId emberNodeId;
    uint32_t timeStamp;
} EmberAfJoiningDevice;

/**
 * @brief Permit join times
 */
#define EMBER_AF_PERMIT_JOIN_FOREVER 0xFF
#define EMBER_AF_PERMIT_JOIN_MAX_TIMEOUT 0xFE

#define MAX_INT32U_VALUE (0xFFFFFFFFUL)
#define MAX_INT16U_VALUE (0xFFFF)
#define MAX_INT8U_VALUE (0xFF)

/**
 * @brief Returns the elapsed time between two 32 bit values.
 *   Result may not be valid if the time samples differ by more than 2147483647
 */
#define elapsedTimeInt32u(oldTime, newTime) ((uint32_t)((uint32_t)(newTime) - (uint32_t)(oldTime)))

/**
 * @brief The overhead of the ZDO response.
 *   1 byte for the sequence and 1 byte for the status code.
 */
#define EMBER_AF_ZDO_RESPONSE_OVERHEAD 2

/** @} END addtogroup */
