//===========================================================================//
// File:	NetStatCollector.hpp				
// Contents : All movement messages and rewind capabilites				
//---------------------------------------------------------------------------//
//   Date    Who  Modification                                               //
// --------  ---  ---------------------------------------------------------- //
// 03/07/00  JSE  Inital coding
//---------------------------------------------------------------------------//
// Copyright (C) 1998, Microsoft Corp.										 //
// All Rights reserved worldwide                                             //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL               //
//===========================================================================//


#pragma once

#include "Adept.hpp"
#include "Network.hpp"
#include "Application.hpp"

namespace Adept 
{
	class NetStatCollector
	{
	private:
		
		
		bool m_dirtyFlag;
		MString m_statName;

		
		int m_numberAccumulator[Maximum_Players];
		int m_publishedStat[Maximum_Players];
		int m_publishedLifetimeStatTotal[Maximum_Players];

		

		int m_publishedStatTotal;
		int m_lifeTimeTotal;

		Stuff::Time lastPublish;


	public:

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// 
		NetStatCollector()
		{
			m_dirtyFlag = true;
			lastPublish = gos_GetElapsedTime();
			for (int i = 0; i < Maximum_Players; ++i)
			{
				m_numberAccumulator[i] = 0;
				m_publishedStat[i] = 0;
				m_publishedLifetimeStatTotal[i] = 0;
			}
			m_publishedStatTotal = 0;
			m_lifeTimeTotal = 0;
		}
		
		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
		// 
		
		bool IsDirty(void)
		{
			return m_dirtyFlag;
		}
		
		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
		// 
		
		void ClearDirty(void)
		{
			m_dirtyFlag = false;
		}
		
		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
		// 
		
		void SetName(char *name)
		{
			m_dirtyFlag = true;
			m_statName = name;
		}
		
		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
		// 

		const char *GetName(void)
		{
			return m_statName;
		}

		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
		// 

		void AddToStatistic(int index, int number)
		{
			
			Verify(index >= 0 && index < Maximum_Players);
			m_numberAccumulator[index] += number;
			m_lifeTimeTotal += number;

		}

		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
		// 

		int GetPublishedStat(int index)
		{
			Verify(index >= 0 && index < Maximum_Players);
			return m_publishedStat[index];
		}

		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
		// 

		int GetPublishedStatLifetimeTotal(int index)
		{
			Verify(index >= 0 && index < Maximum_Players);
			return m_publishedLifetimeStatTotal[index];
		}

		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
		// 

		int GetPublishedStatTotal()
		{
			return m_publishedStatTotal;
		}

		
		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
		// 

		int GetLifetimeTotal()
		{
			return m_lifeTimeTotal;
		}

		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
		//
		
		void AddConnection(int connection_index)
		{
			m_dirtyFlag = true;
			m_numberAccumulator[connection_index] = 0;
			m_publishedStat[connection_index] = 0;
			m_publishedLifetimeStatTotal[connection_index] = 0;
		}

		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
		// 

		void RemoveConnection(int connection_index)
		{
			m_dirtyFlag = true;
			m_numberAccumulator[connection_index] = 0;
			m_publishedStat[connection_index] = 0;
			m_publishedLifetimeStatTotal[connection_index] = 0;
		}

		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
		// 

		void AdvanceTime(void)
		{
			if ( (gos_GetElapsedTime() - lastPublish) > 1.0f)
			{
				m_dirtyFlag = true;
				lastPublish = gos_GetElapsedTime();

				m_publishedStatTotal = 0;
				
				for (int i = 0; i < Maximum_Players; ++i)
				{
					m_publishedStat[i] = m_numberAccumulator[i];
					m_numberAccumulator[i] = 0;
					m_publishedStatTotal += m_publishedStat[i];
					m_publishedLifetimeStatTotal[i]+= m_publishedStat[i];
				}
			}
		}
	};
}