/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
// Original file Copyright Crytek GMBH or its affiliates, used under license.

// Description : This is the header file for the module Realtime remote
//               update  The purpose of this module is to allow data update to happen
//               remotely so that you can  for example  edit the terrain and see the changes
//               in the console


#ifndef CRYINCLUDE_CRYACTION_LIVEPREVIEW_REALTIMEREMOTEUPDATE_H
#define CRYINCLUDE_CRYACTION_LIVEPREVIEW_REALTIMEREMOTEUPDATE_H
#pragma once

#include "INotificationNetwork.h"
#include "IRealtimeRemoteUpdate.h"
#include "I3DEngine.h"

typedef std::vector<IRealtimeUpdateGameHandler*> GameHandlerList;

class CRealtimeRemoteUpdateListener
    : public INotificationNetworkListener
    , public IRealtimeRemoteUpdate
{
    //////////////////////////////////////////////////////////////////////////
    // Methods
public:
    // From IRealtimeRemoteUpdate
    virtual bool    Enable(bool boEnable = true);
    virtual bool    IsEnabled();

    // Game code handlers for live preview updates
    virtual void AddGameHandler(IRealtimeUpdateGameHandler* handler);
    virtual void RemoveGameHandler(IRealtimeUpdateGameHandler* handler);

    // From INotificationNetworkListener and from IRealtimeRemoteUpdate
    virtual void OnNotificationNetworkReceive(const void* pBuffer, size_t length);

    // Singleton management
    static CRealtimeRemoteUpdateListener&   GetRealtimeRemoteUpdateListener();

    virtual void Update();
protected:
    CRealtimeRemoteUpdateListener();
    virtual ~CRealtimeRemoteUpdateListener();

    void LoadArchetypes(XmlNodeRef& root);
    void LoadTimeOfDay(XmlNodeRef& root);
    void LoadMaterials(XmlNodeRef& root);
    void LoadConsoleVariables(XmlNodeRef& root);
    void LoadParticles(XmlNodeRef& root);
    void LoadTerrainLayer(XmlNodeRef& root, unsigned char*  uchData);
    void LoadEntities(XmlNodeRef& root);

    bool IsSyncingWithEditor();
    //////////////////////////////////////////////////////////////////////////
    // Data
protected:

    // As currently you can't query if the currently listener is registered
    // the control has to be done here.
    bool m_boIsEnabled;

    GameHandlerList m_gameHandlers;
    CTimeValue m_lastKeepAliveMessageTime;

    typedef std::vector<unsigned char> TDBuffer;

    CryMT::CLocklessPointerQueue<TDBuffer>  m_ProcessingQueue;
};

#endif // CRYINCLUDE_CRYACTION_LIVEPREVIEW_REALTIMEREMOTEUPDATE_H