#include "General.h"
#include "BuildingRevivalConsoleCommands.h"
#include "engine_tt.h"
#include "engine_io.h"
#include "engine_game.h"
#include "gmgame.h"
#include "Iterator.h"
#include "BuildingGameObjDef.h"
#include "BuildingGameObj.h"
#include "CommandLineParser.h"
#include "GameObjManager.h"

#define GDI 1
#define NOD 0

class CommandREVIVEBAR :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "revivebar"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVEBAR - Revives the GDI Barracks."; 
	}
	void Activate(const char* argumentsString)
	{

		Restore_Building(Find_Soldier_Factory(GDI));
		Create_2D_WAV_Sound_Team_Dialog("m00bgib_dsgn0009i1evan_snd.wav",0);
		Create_2D_WAV_Sound_Team_Dialog("M00BGIB_DSGN0008I1EVAG_SND.wav",1);
	}
};

class CommandREVIVEHON :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "revivehon"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVEHON - Revives the Hand of Nod."; 
	}
	void Activate(const char* argumentsString)
	{
		Restore_Building(Find_Soldier_Factory(NOD));
		Create_2D_WAV_Sound_Team_Dialog("M00BNHN_DSGN0016I1EVAN_SND.wav", 0);
		Create_2D_WAV_Sound_Team_Dialog("m00bnhn_dsgn0015i1evag_snd.wav", 1);
	}
};

class CommandREVIVEGDIPP :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "revivegdipp"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVEGDIPP - Revives the GDI Power Plant."; 
	}
	void Activate(const char* argumentsString)
	{
		bool revived=false;
		for (SLNode<BuildingGameObj> *z = GameObjManager::BuildingGameObjList.Head();z;z = z->Next())
		{
			BuildingGameObj *GDIPP = z->Data()->As_BuildingGameObj();

			if(GDIPP && Building_Type(GDIPP)==TYPE_POWER_PLANT && Get_Object_Type(GDIPP)==GDI)
			{
				if(GDIPP->As_BuildingGameObj()->Is_Destroyed())
				{
					revived=true;
					Restore_Building(GDIPP);
				}
			}
		}

		if(revived)
		{
			Create_2D_WAV_Sound_Team_Dialog("m00bgpp_dsgn0010i1evan_snd.wav", 0);
			Create_2D_WAV_Sound_Team_Dialog("m00bgpp_dsgn0009i1evag_snd.wav", 1);
		}
	}
};

class CommandREVIVENODPP :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "revivenodpp"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVENODPP - Revives the Nod Power Plant."; 
	}
	void Activate(const char* argumentsString)
	{
		bool revived=false;
		for (SLNode<BuildingGameObj> *z = GameObjManager::BuildingGameObjList.Head();z;z = z->Next())
		{
			BuildingGameObj *NodPP = z->Data()->As_BuildingGameObj();

			if(NodPP && Building_Type(NodPP)==TYPE_POWER_PLANT && Get_Object_Type(NodPP)==0)
			{
				if(NodPP->As_BuildingGameObj()->Is_Destroyed())
				{
					revived=true;
					Restore_Building(NodPP);
				}
			}
		}

		if(revived)
		{
			Create_2D_WAV_Sound_Team_Dialog("m00bnpp_dsgn0010i1evan_snd.wav", 0);
			Create_2D_WAV_Sound_Team_Dialog("m00bnpp_dsgn0009i1evag_snd.wav", 1);
		}
	}
};

class CommandREVIVEGDICY :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "revivegdicy"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVEGDICY - Revives the GDI Construction Yard."; 
	}
	void Activate(const char* argumentsString)
	{
		GameObject *ConYard = Find_Construction_Yard(GDI);

		Restore_Building(ConYard);
		Create_2D_WAV_Sound_Team_Dialog("m00bgcy_dsgn0010i1evan_snd.wav",0);
		Create_2D_WAV_Sound_Team_Dialog("m00bgcy_dsgn0009i1evag_snd.wav",1);
	}
};

class CommandREVIVENODCY :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "revivenodcy"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVENODCY - Revives the Nod Construction Yard."; 
	}
	void Activate(const char* argumentsString)
	{
		GameObject *ConYard = Find_Construction_Yard(NOD);

		Restore_Building(ConYard);
		Create_2D_WAV_Sound_Team_Dialog("m00bncy_dsgn0009i1evan_snd.wav",0);
		Create_2D_WAV_Sound_Team_Dialog("m00bncy_dsgn0008i1evag_snd.wav",1);
	}
};

class CommandREVIVEGDIREF :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "revivegdiref"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVEGDIREF - Revives the GDI Refinery."; 
	}
	void Activate(const char* argumentsString)
	{
		Restore_Building(Find_Refinery(GDI));

		if(Find_Refinery(GDI))
		{
			if(stristr(Commands->Get_Preset_Name(Find_Refinery(GDI)),"Silo"))
			{
				Create_2D_WAV_Sound_Team_Dialog("M00BGTS_DSGN0002I1EVAN_SND.wav", 0);
				Create_2D_WAV_Sound_Team_Dialog("M00BGTS_DSGN0001I1EVAG_SND.wav", 1);
			}

			else
			{
				Create_2D_WAV_Sound_Team_Dialog("m00bgtr_dsgn0010i1evan_snd.wav", 0);
				Create_2D_WAV_Sound_Team_Dialog("m00bgtr_dsgn0009i1evag_snd.wav", 1);
			}
		}
	}
};

class CommandREVIVENODREF :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "revivenodref"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVENODREF - Revives the Nod Refinery."; 
	}
	void Activate(const char* argumentsString)
	{
		Restore_Building(Find_Refinery(NOD));

		if(Find_Refinery(NOD))
		{
			if(stristr(Commands->Get_Preset_Name(Find_Refinery(NOD)),"Silo"))
			{
				Create_2D_WAV_Sound_Team_Dialog("M00BNTS_DSGN0002I1EVAN_SND.wav", 0);
				Create_2D_WAV_Sound_Team_Dialog("M00BNTS_DSGN0001I1EVAG_SND.wav", 1);
			}

			else
			{
				Create_2D_WAV_Sound_Team_Dialog("m00bntr_dsgn0010i1evan_snd.wav", 0);
				Create_2D_WAV_Sound_Team_Dialog("m00bntr_dsgn0009i1evag_snd.wav", 1);
			}
		}
	}
};

class CommandREVIVENODSILO :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "revivenodsilo"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVENODSILO - Revives the Nod Silo."; 
	}
	void Activate(const char* argumentsString)
	{
		bool revived=false;
		for (SLNode<BuildingGameObj> *z = GameObjManager::BuildingGameObjList.Head();z;z = z->Next())
		{
			BuildingGameObj *SILO= z->Data()->As_BuildingGameObj();

			if(SILO && Get_Object_Type(SILO)==0)
			{
				if(stristr(Commands->Get_Preset_Name(SILO),"Silo"))
				{
					if(SILO->As_BuildingGameObj()->Is_Destroyed())
					{
						revived=true;
						Restore_Building(SILO);
					}

				}
			}
		}

		if(revived==true)
		{
			Create_2D_WAV_Sound_Team_Dialog("M00BNTS_DSGN0002I1EVAN_SND.wav", 0);
			Create_2D_WAV_Sound_Team_Dialog("M00BNTS_DSGN0001I1EVAG_SND.wav", 1);
		}
	}
};

class CommandREVIVEGDISILO :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "revivegdisilo"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVEGDISILO - Revives the GDI Silo."; 
	}
	void Activate(const char* argumentsString)
	{
		bool revived=false;
		for (SLNode<BuildingGameObj> *z = GameObjManager::BuildingGameObjList.Head();z;z = z->Next())
		{
			BuildingGameObj *SILO= z->Data()->As_BuildingGameObj();

			if(SILO && Get_Object_Type(SILO)==1)
			{
				if(stristr(Commands->Get_Preset_Name(SILO),"Silo"))
				{
					if(SILO->As_BuildingGameObj()->Is_Destroyed())
					{
						revived=true;
						Restore_Building(SILO);
					}

				}
			}
		}

		if(revived==true)
		{
			Create_2D_WAV_Sound_Team_Dialog("M00BGTS_DSGN0002I1EVAN_SND.wav", 0);
			Create_2D_WAV_Sound_Team_Dialog("M00BGTS_DSGN0001I1EVAG_SND.wav", 1);
		}
	}
};

class CommandREVIVEGDIREPBAY :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "revivegdirepbay"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVEGDIREPBAY - Revives the GDI Repair Bay."; 
	}
	void Activate(const char* argumentsString)
	{
		Restore_Building(Find_Repair_Bay(GDI));
	}
};

class CommandREVIVENODREPBAY :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "revivenodrepbay"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVENODREPBAY - Revives the Nod Repair Bay."; 
	}
	void Activate(const char* argumentsString)
	{
		Restore_Building(Find_Repair_Bay(NOD));
	}
};

class CommandREVIVEGDISHRINE :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "revivegdishrine"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVEGDISHRINE - Revives the GDI Superweapon Facility."; 
	}
	void Activate(const char* argumentsString)
	{
		Restore_Building(Find_Shrine(GDI));
		Create_2D_WAV_Sound_Team_Dialog("m00bgcc_dsgn0002i1evan_snd.wav",0);
		Create_2D_WAV_Sound_Team_Dialog("m00bgcc_dsgn0001i1evag_snd.wav",1);
	}
};

class CommandREVIVENODSHRINE :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "revivenodshrine"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVENODSHRINE - Revives the Shrine of Nod."; 
	}
	void Activate(const char* argumentsString)
	{
		Restore_Building(Find_Shrine(NOD));
		Create_2D_WAV_Sound_Team_Dialog("m00bnsn_dsgn0013i1evag_snd.wav", 1);
		Create_2D_WAV_Sound_Team_Dialog("M00BNsn_DSGN0014I1EVAN_SND.wav", 0);
	}
};


class CommandREVIVEWF :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "revivewf"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVEWF - Revives the GDI Weapons Factory."; 
	}
	void Activate(const char* argumentsString)
	{
		Restore_Building(Find_Vehicle_Factory(GDI));
		Create_2D_WAV_Sound_Team_Dialog("M00BGWF_DSGN0009I1EVAG_SND.wav",1);
		Create_2D_WAV_Sound_Team_Dialog("m00bgwf_dsgn0010i1evan_snd.wav",0);
	}
};

class CommandREVIVEAIR :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "reviveair"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVEAIR - Revives the Nod Airstrip."; 
	}
	void Activate(const char* argumentsString)
	{
		Restore_Building(Find_Vehicle_Factory(NOD));
		Create_2D_WAV_Sound_Team_Dialog("m00bnaf_dsgn0009i1evag_snd.wav", 1);
		Create_2D_WAV_Sound_Team_Dialog("M00BNAF_DSGN0010I1EVAN_SND.wav", 0);
	}
};

class CommandREVIVEGDICC :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "revivegdicc"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVEGDICC - Revives the GDI Communications Center."; 
	}
	void Activate(const char* argumentsString)
	{
		Restore_Building(Find_Com_Center(GDI));
		Create_2D_WAV_Sound_Team_Dialog("m00bgcc_dsgn0002i1evan_snd.wav",0);
		Create_2D_WAV_Sound_Team_Dialog("m00bgcc_dsgn0001i1evag_snd.wav",1);
	}
};

class CommandREVIVENODCC :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "revivenodcc"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVENODCC - Revives the Nod Communications Center."; 
	}
	void Activate(const char* argumentsString)
	{
		Restore_Building(Find_Com_Center(NOD));
		Create_2D_WAV_Sound_Team_Dialog("m00bncc_dsgn0010i1evan_snd.wav",0);
		Create_2D_WAV_Sound_Team_Dialog("m00bncc_dsgn0009i1evag_snd.wav",1);
	}
};

class CommandREVIVEAGT :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "reviveagt"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVEAGT - Revives the GDI Advanced Guard Tower."; 
	}
	void Activate(const char* argumentsString)
	{
		bool revived=false;
		for (SLNode<BuildingGameObj> *z = GameObjManager::BuildingGameObjList.Head();z;z = z->Next())
		{
			BuildingGameObj *AGT= z->Data()->As_BuildingGameObj();

			if(AGT && Building_Type(AGT)==TYPE_BASE_DEFENSE && Get_Object_Type(AGT)==1)
			{
				if(AGT->As_BuildingGameObj()->Is_Destroyed())
				{
					revived=true;
					Restore_Building(AGT);
				}
			}
		}
		if(revived)
		{
			Create_2D_WAV_Sound_Team_Dialog("m00bgat_dsgn0008i1evan_snd.wav", 0);
			Create_2D_WAV_Sound_Team_Dialog("m00bgat_dsgn0007i1evag_snd.wav", 1);
		}
	}
};

class CommandREVIVEOB :
	public ConsoleFunctionClass
{
public:
	const char* Get_Name() 
	{ 
		return "reviveob"; 
	}
	const char* Get_Help() 
	{ 
		return "REVIVEOB - Revives the Nod Obelisk."; 
	}
	void Activate(const char* argumentsString)
	{
		bool revived=false;
		for (SLNode<BuildingGameObj> *z = GameObjManager::BuildingGameObjList.Head();z;z = z->Next())
		{
			BuildingGameObj *Obelisk = z->Data()->As_BuildingGameObj();

			if(Obelisk && Building_Type(Obelisk)==TYPE_BASE_DEFENSE && Get_Object_Type(Obelisk)==0)
			{
				if(Obelisk->As_BuildingGameObj()->Is_Destroyed())
				{
					revived=true;
					Restore_Building(Obelisk);
				}
			}
		}

		if(revived)
		{
			Create_2D_WAV_Sound_Team_Dialog("m00bnol_dsgn0008i1evan_snd.wav", 0);
			Create_2D_WAV_Sound_Team_Dialog("m00bnol_dsgn0007i1evag_snd.wav", 1);
		}
	}
};

class BUILDINGREVIVALCONSOLECOMMANDS : public Plugin
{
public:
	BUILDINGREVIVALCONSOLECOMMANDS()
	{
		ConsoleFunctionList.Add(new CommandREVIVEBAR);
		ConsoleFunctionList.Add(new CommandREVIVEHON);
		ConsoleFunctionList.Add(new CommandREVIVEGDIPP);
		ConsoleFunctionList.Add(new CommandREVIVENODPP);
		ConsoleFunctionList.Add(new CommandREVIVEGDICY);
		ConsoleFunctionList.Add(new CommandREVIVENODCY);
		ConsoleFunctionList.Add(new CommandREVIVEGDIREF);
		ConsoleFunctionList.Add(new CommandREVIVENODREF);
		ConsoleFunctionList.Add(new CommandREVIVEGDISILO);
		ConsoleFunctionList.Add(new CommandREVIVENODSILO);
		ConsoleFunctionList.Add(new CommandREVIVEGDIREPBAY);
		ConsoleFunctionList.Add(new CommandREVIVENODREPBAY);
		ConsoleFunctionList.Add(new CommandREVIVEGDISHRINE);
		ConsoleFunctionList.Add(new CommandREVIVENODSHRINE);
		ConsoleFunctionList.Add(new CommandREVIVEWF);
		ConsoleFunctionList.Add(new CommandREVIVEAIR);
		ConsoleFunctionList.Add(new CommandREVIVEGDICC);
		ConsoleFunctionList.Add(new CommandREVIVENODCC);
		ConsoleFunctionList.Add(new CommandREVIVEAGT);
		ConsoleFunctionList.Add(new CommandREVIVEOB);
		Sort_Function_List();
		Verbose_Help_File();
	}
	~BUILDINGREVIVALCONSOLECOMMANDS()
	{
		const DynamicVectorClass<ConsoleFunctionClass*> consoleFunctions(ConsoleFunctionList);
		TT_FOREACH(consoleFunction, consoleFunctions)
		{
			const char* name = (*consoleFunction)->Get_Name();
			if (name)
			{ // DEBUG CRAP NEED TO UPDATE THE STRCMPS
				if (strcmp(name, "revivebar") == 0 || strcmp(name, "revivehon") == 0 || strcmp(name, "revivegdipp") == 0 || strcmp(name, "revivenodpp") == 0 || strcmp(name, "revivegdicy") == 0 || strcmp(name, "revivenodcy") == 0 || strcmp(name, "revivegdiref") == 0 || strcmp(name, "revivenodref") == 0 || strcmp(name, "revivegdirepbay") == 0 || strcmp(name, "revivenodrepbay") == 0 || strcmp(name, "revivegdishrine") == 0 || strcmp(name, "revivenodshrine") == 0 || strcmp(name, "revivewf") == 0 || strcmp(name, "reviveair") == 0 || strcmp(name, "revivegdicc") == 0 || strcmp(name, "revivenodcc") == 0 || strcmp(name, "reviveagt") == 0 ||strcmp(name, "reviveob") == 0 || strcmp(name, "revivegdisilo") == 0 || strcmp(name, "revivenodsilo") == 0) 
				{
					ConsoleFunctionList.Delete(consoleFunction);
				}
			}
		}
	}	
};

BUILDINGREVIVALCONSOLECOMMANDS buildingrevivalconsolecommands;


extern "C" __declspec(dllexport) Plugin* Plugin_Init()
{
	return &buildingrevivalconsolecommands;
}