/****************************************************************************
 * 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 "./c_getvalues.h"
#include "./aqhome_data_p.h"
#include "aqhome/ipc/data/ipc_data.h"
#include "aqhome/ipc/data/msg_data_values.h"
#include "aqhome/ipc/msg_ipc_result.h"

#include <gwenhywfar/debug.h>



/* ------------------------------------------------------------------------------------------------
 * defines
 * ------------------------------------------------------------------------------------------------
 */

#define AQHOMEDATA_VALUESPERMSG 10



/* ------------------------------------------------------------------------------------------------
 * forward declarations
 * ------------------------------------------------------------------------------------------------
 */

static void _sendValueList(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE_LIST *vl, uint32_t flags);



/* ------------------------------------------------------------------------------------------------
 * implementations
 * ------------------------------------------------------------------------------------------------
 */

void AqHomeData_HandleGetValues(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg)
{
  const AQH_VALUE_LIST *origValueList;

  DBG_INFO(NULL, "HandleGetValues");
  origValueList=AQH_Storage_GetValueList(aqh->storage);
  if (origValueList) {
    DBG_INFO(NULL, "Have a list of %d values", AQH_Value_List_GetCount(origValueList));
    if (AQH_Value_List_GetCount(origValueList)<AQHOMEDATA_VALUESPERMSG) {
      DBG_INFO(NULL, "Sending all entries in one message");
      _sendValueList(aqh, ep, origValueList, AQH_MSGDATA_VALUES_FLAGS_LASTMSG);
    }
    else {
      AQH_VALUE_LIST *tmpValueList;
      const AQH_VALUE *v;

      DBG_INFO(NULL, "Sending entries in multiple messages");
      tmpValueList=AQH_Value_List_new();
      v=AQH_Value_List_First(origValueList);
      while(v) {
	const AQH_VALUE *next;
	AQH_VALUE *copyOfValue;

	next=AQH_Value_List_Next(v);
	copyOfValue=AQH_Value_dup(v);
	AQH_Value_List_Add(copyOfValue, tmpValueList);
	if (AQH_Value_List_GetCount(tmpValueList)>=AQHOMEDATA_VALUESPERMSG) {
          DBG_INFO(NULL, "Sending %d values", AQH_Value_List_GetCount(tmpValueList));
	  _sendValueList(aqh, ep, tmpValueList, next?0:AQH_MSGDATA_VALUES_FLAGS_LASTMSG);
	  AQH_Value_List_Clear(tmpValueList);
	}
	v=next;
      }
      if (AQH_Value_List_GetCount(tmpValueList)) {
        DBG_INFO(NULL, "Sending %d values", AQH_Value_List_GetCount(tmpValueList));
        _sendValueList(aqh, ep, tmpValueList, AQH_MSGDATA_VALUES_FLAGS_LASTMSG); /* send remaining */
      }
      AQH_Value_List_free(tmpValueList);
    }
  }
  else {
    /* empty list */
    _sendValueList(aqh, ep, NULL, AQH_MSGDATA_VALUES_FLAGS_LASTMSG);
  }
}



void _sendValueList(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE_LIST *vl, uint32_t flags)
{
  GWEN_MSG *msg;

  msg=AQH_ValuesDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_GETVALUES_RSP, flags, vl);
  GWEN_MsgEndpoint_AddSendMessage(ep, msg);
}



