#include "Constants.h"
#include <iostream>

namespace assets
{
	namespace constants
	{
		namespace general
		{
			float TBCapDenominator;
			float wildlingDaySight;
			float wildlingNightSight;
			float wildlingWanderRangeDenominator;
			float wildlingWanderRangeMultiplier;
			float retryDelay;
			std::string maleTitle;
			std::string femaleTitle;
			Range wanderRange;
			float townCenterSight;
			float buildRange;
			float denRange;
			float pathingLimitMargin;

			void load(gge::resource::DataArray &dataArray)
			{
				int index = 0;
				TBCapDenominator			  = dataArray.getFloat(index++);
				wildlingDaySight              = dataArray.getFloat(index++);
				wildlingNightSight		      = dataArray.getFloat(index++);
				wildlingWanderRangeDenominator  = dataArray.getFloat(index++);
				wildlingWanderRangeMultiplier = dataArray.getFloat(index++);
				retryDelay					  = dataArray.getFloat(index++);
				
				maleTitle    = dataArray.getString(index++);
				femaleTitle  = dataArray.getString(index++);

				wanderRange.value = dataArray.getFloat(index++);
				wanderRange.range = dataArray.getFloat(index++);

				townCenterSight      = dataArray.getFloat(index++);
				buildRange = dataArray.getFloat(index++);
				denRange		     = dataArray.getFloat(index++);
				pathingLimitMargin   = dataArray.getFloat(index++);
			}
		}
		namespace stats
		{
			int   minStat;
			int   maxStat;
			int   maxLvl;
			float walkingStaminaDrainRate;
			float joggingStaminaDrainRate;
			float runningStaminaDrainRate;

			void load(gge::resource::DataArray &dataArray)
			{
				int index = 0;

				minStat					= dataArray.getInt(index++);
				maxStat					= dataArray.getInt(index++);
				maxLvl					= dataArray.getInt(index++);
				walkingStaminaDrainRate = dataArray.getFloat(index++);
				joggingStaminaDrainRate = dataArray.getFloat(index++);
				runningStaminaDrainRate = dataArray.getFloat(index++);
			}
		}

		namespace crafting
		{
			float base;
			float strMultiplier;
			float dexMultiplier;
			float intlMultiplier;
			float lvlMultiplier;

			void load(gge::resource::DataArray &dataArray)
			{
				int index = 0;

				base		   = dataArray.getFloat(index++);
				strMultiplier  = dataArray.getFloat(index++);
				dexMultiplier  = dataArray.getFloat(index++);
				intlMultiplier = dataArray.getFloat(index++);
				lvlMultiplier  = dataArray.getFloat(index++);
			}
		}

		namespace gold
		{
			float base;
			float lvlMultiplier;
			float lvlSqrMultiplier;
			float soldierGoldCost;
			float artisanGoldCost;

			void load(gge::resource::DataArray &dataArray)
			{
				int index = 0;

				base             = dataArray.getFloat(index++);
				lvlMultiplier    = dataArray.getFloat(index++);
				lvlSqrMultiplier = dataArray.getFloat(index++);
				soldierGoldCost  = dataArray.getFloat(index++);
				artisanGoldCost  = dataArray.getFloat(index++);
			}
		}

		namespace happiness
		{
			float base;
			float taxRateMultiplier;
			float populationMultiplier;
			float differenceDenominator;
			float timeMultiplier1;
			float timeMultiplier2;
			float populationLim;
			float currentHappinessModifier;
			float currentHappinessMultiplier;
			//
			float happinesDeathModifier;

			void load(gge::resource::DataArray &dataArray)
			{
				int index = 0;

				base					   = dataArray.getFloat(index++);
				taxRateMultiplier		   = dataArray.getFloat(index++);
				populationMultiplier	   = dataArray.getFloat(index++);
				differenceDenominator	   = dataArray.getFloat(index++);
				timeMultiplier1			   = dataArray.getFloat(index++);
				timeMultiplier2			   = dataArray.getFloat(index++);
				populationLim			   = dataArray.getFloat(index++);
				currentHappinessModifier   = dataArray.getFloat(index++);
				currentHappinessMultiplier = dataArray.getFloat(index++);
				//
				happinesDeathModifier      = dataArray.getFloat(index++);
			}
		}

		namespace combat
		{
			float dodgeChanceModifier;
			float parryCDModifier;
			float blockChanceModifier;
			float staggerStrDenominator;
			float staggerVitDenominator;
			float staggerMultiplier;
			float staggerStaminaDenominator;
			float staggerAtckCDDenominator;
			float staggerEffectivenessModifier;
			float armorPierceEffectivenessModifier;
			float overshootTimeMultiplier;
			int   archerMinRange;
			float rangedAttackEffectivenessModifier;
			float rangedMissChanceDenominator;
			float rangedMissChanceAccMultiplier;
			float rangedMissChanceLvlMultiplier;

			void load(gge::resource::DataArray &dataArray)
			{
				int index = 0;

				dodgeChanceModifier				  = dataArray.getFloat(index++);
				parryCDModifier					  = dataArray.getFloat(index++);
				blockChanceModifier			      = dataArray.getFloat(index++);
				staggerStrDenominator			  = dataArray.getFloat(index++);
				staggerVitDenominator			  = dataArray.getFloat(index++);
				staggerMultiplier				  = dataArray.getFloat(index++);
				staggerStaminaDenominator		  = dataArray.getFloat(index++);
				staggerAtckCDDenominator		  = dataArray.getFloat(index++);
				staggerEffectivenessModifier	  = dataArray.getFloat(index++);
				armorPierceEffectivenessModifier  = dataArray.getFloat(index++);
				overshootTimeMultiplier			  = dataArray.getFloat(index++);
				archerMinRange					  = dataArray.getInt(index++);
				rangedAttackEffectivenessModifier = dataArray.getFloat(index++);
				rangedMissChanceDenominator		  = dataArray.getFloat(index++);
				rangedMissChanceAccMultiplier	  = dataArray.getFloat(index++);
				rangedMissChanceLvlMultiplier	  = dataArray.getFloat(index++);

			}
		}

		namespace human
		{
			float HPBase;
			float HPVitMultiplier;
			float HPLvlMultiplier;

			float staminaBase;
			float staminaVitMultiplier;
			float staminaStrMultiplier;
			float staminaLvlMultiplier;

			float movementBase;
			float movementSpeMultiplier;
			float movementLvlMultiplier;

			float daySightBase;
			float daySightVitMultiplier;
			float daySightIntlMultiplier;
			float daySightLvlMultiplier;

			float nightSightBase;
			float nightSightVitMultiplier;
			float nightSightIntlMultiplier;
			float nightSightLvlMultiplier;

			Stat femaleStats;
			Stat maleStats;

			float statDenominator;

			float dogdgeBase;
			float dodgeAccMultiplier;
			float dodgeIntlMultiplier;
			float dodgeLvlMultiplier;

			std::vector<std::string> maleNames;
			std::vector<std::string> femaleNames;
			std::vector<std::string> surnames;



			void readAndWriteNames(std::ifstream &data, std::vector<std::string> &vec)
			{
				if (data.is_open())
				{
					std::string name;
					while(std::getline(data, name))
					{
						vec.push_back(name);
					}
				}
				else
				{
					std::cerr << "Failed to open file.\n";
				}
			}

			void load(gge::resource::DataArray &dataArray)
			{
				int index = 0;

				HPBase					= dataArray.getFloat(index++);
				HPVitMultiplier			= dataArray.getFloat(index++);
				HPLvlMultiplier			= dataArray.getFloat(index++);

				staminaBase				= dataArray.getFloat(index++);
				staminaVitMultiplier	= dataArray.getFloat(index++);
				staminaStrMultiplier	= dataArray.getFloat(index++);
				staminaLvlMultiplier	= dataArray.getFloat(index++);

				movementBase			= dataArray.getFloat(index++);
				movementSpeMultiplier	= dataArray.getFloat(index++);
				movementLvlMultiplier	= dataArray.getFloat(index++);

				daySightBase			= dataArray.getFloat(index++);
				daySightVitMultiplier	= dataArray.getFloat(index++);
				daySightIntlMultiplier	= dataArray.getFloat(index++);
				daySightLvlMultiplier	= dataArray.getFloat(index++);

				nightSightBase			 = dataArray.getFloat(index++);
				nightSightVitMultiplier  = dataArray.getFloat(index++);
				nightSightIntlMultiplier = dataArray.getFloat(index++);
				nightSightLvlMultiplier  = dataArray.getFloat(index++);

				maleStats.str  = dataArray.getFloat(index++);
				maleStats.dex  = dataArray.getFloat(index++);
				maleStats.acc  = dataArray.getFloat(index++);
				maleStats.spe  = dataArray.getFloat(index++);
				maleStats.intl = dataArray.getFloat(index++);
				maleStats.vit  = dataArray.getFloat(index++);

				femaleStats.str  = dataArray.getFloat(index++);
				femaleStats.dex  = dataArray.getFloat(index++);
				femaleStats.acc  = dataArray.getFloat(index++);
				femaleStats.spe  = dataArray.getFloat(index++);
				femaleStats.intl = dataArray.getFloat(index++);
				femaleStats.vit  = dataArray.getFloat(index++);

				statDenominator = dataArray.getFloat(index++);

				dogdgeBase			= dataArray.getFloat(index++);
				dodgeAccMultiplier  = dataArray.getFloat(index++);
				dodgeIntlMultiplier = dataArray.getFloat(index++);
				dodgeLvlMultiplier  = dataArray.getFloat(index++);

				std::ifstream data;
				data.open("Assets/Male Names.txt");
				readAndWriteNames(data, maleNames);
				data.close();

				data.open("Assets/Female Names.txt");
				readAndWriteNames(data, femaleNames);
				data.close();

				data.open("Assets/Surnames.txt");
				readAndWriteNames(data, surnames);
				data.close();
			}
		}

		namespace leveling
		{
			float XPIntlModifier;
			float XPIntlDenominator;
			int   soldierLvlCap;
			int   artisanLvlCap;
			float nextLvlBase;
			float nextLvlIncrement;
			float nextLvlMultiplier;
			//
			float XPMultiplier;

			void load(gge::resource::DataArray &dataArray)
			{
				int index = 0;

				XPIntlModifier	  = dataArray.getFloat(index++);
				XPIntlDenominator = dataArray.getFloat(index++);
				soldierLvlCap	  = dataArray.getInt(index++);
				artisanLvlCap	  = dataArray.getInt(index++);
				nextLvlBase		  = dataArray.getFloat(index++);
				nextLvlIncrement  = dataArray.getFloat(index++);
				nextLvlMultiplier = dataArray.getFloat(index++);
				//
				XPMultiplier      = dataArray.getFloat(index++);
			}
		}

	}
}