#pragma once

#include <deque>
#include <limits>

#include "Common.h"
#include "ReplayUnit.h"
#include "TechTree.h"


class ReplayUnit;

class IDAReplayObserver : public sc2::ReplayObserver
{
	void setUnits();
	std::vector<ReplayUnit>       m_allUnits;
	std::set<CCUnitID>         m_allUnitsID;
	TechTree                m_techTree;



public:
	IDAReplayObserver();
	
	void OnGameStart() override;
	void OnStep() override;
	void OnGameEnd() override;
	void OnUnitDestroyed(const sc2::Unit*) override;
	virtual void OnReplayUnitDestroyed(const ReplayUnit*);
	void OnUnitCreated(const sc2::Unit*);
	virtual void OnReplayUnitCreated(const ReplayUnit*);
	void OnBuildingConstructionComplete(const sc2::Unit*);

	ReplayUnit GetUnit(const CCUnitID tag) const;
	bool UnitExists(const CCUnitID tag) const;


	const std::vector<ReplayUnit> & GetAllUnits() const;
	CCRace GetPlayerRace(int player);
	std::string GetReplayPath();
	sc2::GameResult GetResultForPlayer(int player);

	const TechTree & GetTechTree() const;

	const TypeData & Data(const UnitType & type) const;
	const TypeData & Data(const CCUpgrade & type) const;
	const TypeData & Data(const MetaType & type) const;
	const TypeData & Data(const Unit & unit) const;

};