/****************************************************************************
 * This file is part of the project AqHome.
 * AqHome (c) by 2023 Martin Preuss, all rights reserved.
 *
 * The license for this file can be found in the file COPYING which you
 * should have received along with this file.
 ****************************************************************************/

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif


#include "aqhome/msg/endpointmgr_p.h"
#include "aqhome/msg/msg_node.h"
#include "aqhome/msg/endpoint_node.h"

#include <gwenhywfar/misc.h>
#include <gwenhywfar/debug.h>




GWEN_INHERIT(GWEN_MSG_ENDPOINT_MGR, AQH_MSG_ENDPOINT_MGR);



static void GWENHYWFAR_CB _freeData(void *bp, void *p);





GWEN_MSG_ENDPOINT_MGR *AQH_MsgEndpointMgr_new(uint8_t busAddr)
{
  GWEN_MSG_ENDPOINT_MGR *mgr;
  AQH_MSG_ENDPOINT_MGR *xmgr;

  mgr=GWEN_MsgEndpointMgr_new();
  GWEN_NEW_OBJECT(AQH_MSG_ENDPOINT_MGR, xmgr);
  GWEN_INHERIT_SETDATA(GWEN_MSG_ENDPOINT_MGR, AQH_MSG_ENDPOINT_MGR, mgr, xmgr, _freeData);
  xmgr->busAddr=busAddr;

  return mgr;
}



void _freeData(void *bp, void *p)
{
  AQH_MSG_ENDPOINT_MGR *xmgr;

  xmgr=(AQH_MSG_ENDPOINT_MGR*) p;
  GWEN_FREE_OBJECT(xmgr);
}



void AQH_MsgEndpointMgr_DistributeMsgFromNodeEndpoint(GWEN_MSG_ENDPOINT_MGR *emgr,
                                                      GWEN_MSG_ENDPOINT *srcEp,
                                                      const GWEN_MSG *msg,
                                                      int groupId)
{
  GWEN_MSG_ENDPOINT_LIST *endpointList;

  endpointList=GWEN_MsgEndpointMgr_GetEndpointList(emgr);
  if (endpointList) {
    GWEN_MSG_ENDPOINT *ep;
    int acceptedGroupIds;
    uint32_t msgGroup;

    msgGroup=AQH_NodeMsg_GetMsgGroup(AQH_NodeMsg_GetMsgType(msg));
    acceptedGroupIds=GWEN_MsgEndpoint_GetAcceptedGroupIds(srcEp);

    ep=GWEN_MsgEndpoint_List_First(endpointList);
    while(ep) {
      if (ep!=srcEp) {
        if (acceptedGroupIds & groupId) {
          uint32_t acceptedMsgGroups;

          acceptedMsgGroups=AQH_NodeEndpoint_GetAcceptedMsgGroups(ep);
          DBG_DEBUG(AQH_LOGDOMAIN, "- checking endpoint %s (msgGroup=%08x, accept: %08x, flags: %08x)",
                    GWEN_MsgEndpoint_GetName(ep),
                    msgGroup, acceptedMsgGroups,
                    GWEN_MsgEndpoint_GetFlags(ep));

          if (!(GWEN_MsgEndpoint_GetFlags(ep) & AQH_MSGEP_NODE_FLAGS_NOMESSAGES) &&
              (msgGroup & acceptedMsgGroups)) {
            /* endpoint accepts this message */
            DBG_DEBUG(AQH_LOGDOMAIN, "  - endpoint %s accepts message", GWEN_MsgEndpoint_GetName(ep));
            GWEN_MsgEndpoint_ProcessOutMessage(ep, GWEN_Msg_dup(msg));
          }
          else {
            DBG_DEBUG(AQH_LOGDOMAIN, "  - endpoint %s does not accept message", GWEN_MsgEndpoint_GetName(ep));
          }
        } /* if (srcGroupId & groupId) */
        else {
          DBG_DEBUG(AQH_LOGDOMAIN, "Endpoint does not contain groupId %d (%02x)", groupId, groupId);
        }
      } /* if (ep!=srcEp) */
      ep=GWEN_MsgEndpoint_List_Next(ep);
    } /* while */
  }
}








