--changes the settings of the campaign according to the user's choice
--[[

**Curseur de longueur de campagne:**
	*elle change la valeur "condition" pour obtenir une defaite ou une victoire, exemple:
		condition = 'GroundTarget["blue"].percent < 45',
		condition = 'Return.TargetAlive("Lar Airbase") < 4 '
	LIMITATIONS:
		-> ne change pas les valeurs de AirUnitReady et AirUnitAlive et ShipHealth
		-> ne sait pas gerer les commandes : OR ou les parentheses : ()
		-> ne prend en compte que < ou <=
	*change le nombre d'avion de reserve, plus il y en a, et plus la campagne dura

**Curseur de difficulté de campagne:**
	*change le skill des 2 camps
		par défaut, celui du joueur est toujours supérieur à l'ENI
		quand le curseur est activé, le coeficient directeur est comme ceci:
		valeur pour le camp AMI
			-- 1 (easy player)		70
			-- 4 (very difficult)	55
		valeur pour le camp ENI
			-- 1 (easy player)		30
			-- 4 (very difficult)	60
		Calculé pour que la valeur 3 soit la valeur par defaut (AMI = 60 ENI = 50)
	
	*change le nombre d'avion ENI ready (et number de reference)
		change le nombre d'avion ENI disponible, plus il y en a, et plus ce sera difficile
		selon une courbe passant par ces points
		1	0.8
		2	0.9
		3	1
		4	1.4
		le resultat (exemple 1.4) est le coeficient
		LIMITATIONS:
			->fonctionne seulement pour les escadrons ayant une ligne reserve, c'est plus simple (nouveau systeme de gestion reserve)
		
**RAZ**
si le joueur repasse (a n'importe quel moment de la campagne) une variable à "false", les valeurs reprennent la valeur d'origine, moins les avions déjà perdu
(sauf les escadrons ayant un escadron de ravitaillement à part, parceque c'est chiant ^^)

**FAQ**
*doit on changer la valeur dans le conf_mod seulement au début de la campagne?
	-> non, à tout moment de la campagne, seul un skipMission sera necessaire

* le RAZ prent'il en compte les pertes anterieur ou remet-il à 0 les pertes et le stock à full?
	-> il prend en compte les pertes antérieur
]]--

------------------------------------------------------------------------------------------------------- 
------------------------------------------------------------------------------------------------------- 
-- last modification: cleanCode_b M52_d
if not versionDCE then versionDCE = {} end
versionDCE["DC_CampaignSettings.lua"] = "1.3.9"
------------------------------------------------------------------------------------------------------- 
-- cleanCode_b 	:
-- adjustment_b	:	
-- Miguel21 modification M52_d	campaign player's choices  (d: corrige automatic bug CVN & debug CVN)(c: debug)(b: difficulté de campagne)(a: durée de la campagne)
------------------------------------------------------------------------------------------------------- 

--[[
PARTIE Slider_CampaignDuration ***************************************************************************
]]--

--[[
droite à 2 points
trouver le coeficient directeur
0 = 100
4 = 0
https://calculis.net/droite
]]--

if mission_ini.Slider_CampaignDuration and mission_ini.Slider_CampaignDuration == true and type(mission_ini.Slider_CampaignDuration ~= "number") then
	print()
	print("********************ATTENTION******************")
	print("*************** In the conf_mod file, for the option 'Slider_CampaignDuration' we expect as value: 'false' or a value between 1 and 4.****************")
	print("********************ATTENTION******************")
	print()
	os.execute 'pause'	
end


-- if mission_ini.Slider_CampaignDuration and type(mission_ini.Slider_CampaignDuration == "number") then
-- print()
-- print()
-- print("DcCSPARTIE Slider_CampaignDuration ***************************************************************************")
-- print("DcCS Slider_CampaignDuration:  "..tostring(mission_ini.Slider_CampaignDuration))	

--[[
	change toutes les valeurs des triggers compris dans le fichier trigger_init
	puis ne selectionne que les trigger concernant la victoire ou perte de la campagne
]]--
for name, trig in pairs(camp_triggers) do
	if trig.action and type(trig.action == "table") then			
		for n = 1, #trig.action do 				
			if trig.action[n] == 'Action.CampaignEnd("win")' or  trig.action[n] == 'Action.CampaignEnd("loss")' then	
				EndOne, EndTwo = trig.action[n]:match("([^,]+)\"([^,]+)")
				EndOne2, winLoss = EndOne:match("([^,]+)\"([^,]+)")															
				-- print()
				-- print("DcCS BEFORE  "..tostring(trig.condition))					
				
				local s = trig.condition
				
				local delimiter = " and "
				local tempConcat = ""					
				for strMatch in (s..delimiter):gmatch("(.-)"..delimiter) do					
					-- print("DcCS strMatch  "..tostring(strMatch))
					local TrigChanged = false
					if mission_ini.Slider_CampaignDuration and type(mission_ini.Slider_CampaignDuration == "number") then
						
						local stringEgal = ""
						local stringAnd = ""										
						one, two = strMatch:match("([^,]+)<([^,]+)")

						if one == nil and two == nil and  string.find(strMatch, "==") then
							one, two = strMatch:match("([^,]+)=([^,]+)")
							-- print("DcCS one  "..tostring(one))
							-- print("DcCS two  "..tostring(two))
							
							one = one:gsub( "=", "")
							
						end
	
						-- si la condition est une addition de plusieurs additions
						-- Return.AirUnitReady("23 TFS")
						local oneNb = 0
						local oneDelimiter = "+"
						--[[
						if string.find(one, oneDelimiter) then 														
							for oneMatch in (one..oneDelimiter):gmatch("(.-)"..oneDelimiter) do								
								if string.find(oneMatch, "AirUnitReady") or string.find(oneMatch, "AirUnitAlive") then						
									local nameOne 
									nameOne, nameTwo = oneMatch:match("([^,]+)\"([^,]+)")
									nameOne, name3 = nameOne:match("([^,]+)\"([^,]+)")
									
									for side_name,side in pairs(oob_air) do									--iterate through sides in oob_air
										for unit_n,unit in pairs(side) do									--iterate through units in side
											if unit.name == name3 then										--unit found
												oneNb = oneNb + unit.number											--return number of total aircraft											
												-- if unit.reserve then
													-- oneNb = oneNb + unit.reserve
												-- end
											end
										end
									end								
									-- -- --recherche le nombre prévu de renfort
									-- -- GetName = {}
									-- -- function GetName.AirUnitReinforce(sourceName, destName, destNumber)
										-- -- oneNb = oneNb + destNumber																	
									-- -- end
									-- -- --recherche dans les triggers 
									-- -- --AirUnitReinforce
									-- -- for RFname, RFtrig in pairs(camp_triggers) do
										-- -- --action = 'Action.AirUnitReinforce("R/335 TFS", "335 TFS", 6)',
										-- -- if RFtrig.action and type(RFtrig.action) ~= "table" and string.find(RFtrig.action, "Action.AirUnitReinforce") and string.find(RFtrig.action, name3) then
											-- -- RFtrigCopy = deepcopy(RFtrig)
											-- -- RFtrigCopy.action = RFtrigCopy.action:gsub( "Action", "GetName")																																	
											-- -- local f = loadstring(RFtrigCopy.action)()											
										-- -- end
									-- -- end									
								end
							end
							-- print("DcCS oneNb  "..tostring(oneNb))
						end
						]]--
						
						if two and string.find(two, "=") then 
							stringEgal = "="
						end
						
						--condition = 'GroundTarget["blue"].percent < 45',
						--condition = 'Return.TargetAlive("Lar Airbase") < 4 						
						if one and (string.find(strMatch, "percent") or  string.find(strMatch, "TargetAlive")) then 
							
							--ATTENTION this bug:condition = 'Return.TargetAlive("CVN-71 Theodore Roosevelt") == 0',
							--This good: condition = 'Return.UnitDead("CVN-71 Theodore Roosevelt")',
							--ceci répare un bug récurent dans camp_triggers_init qui tente de trouver le %alive d'un target qui n'existe pas, mais l'unité existe
							if(string.find(strMatch, "CVN") and string.find(strMatch, "==")) then

								one:gsub("TargetAlive", "UnitDead" )
								tempConcat = one
								trig.condition = tempConcat
								
								-- print("DcCS trig.condition "..tostring(trig.condition))
							end
						elseif string.find(strMatch, "AirUnitReady") or string.find(strMatch, "AirUnitAlive")  then	
							
							-- print("DcCS passe 02 strMatch/AirUnitReady/AirUnitAlive "..tostring(strMatch))
							
							--[[
							two = oneNb - (( oneNb/4) * mission_ini.Slider_CampaignDuration)
							
							-- if winLoss == "win" then
								-- two = oneNb - (( oneNb/4) * mission_ini.Slider_CampaignDuration)
							-- elseif winLoss == "loss" then
								-- two =  oneNb - (( oneNb/4) * mission_ini.Slider_CampaignDuration)														
							-- end							

							if two >= oneNb then two = oneNb - 2 end
							if two <= 0 then two = 2 end
							]]--
						elseif not string.find(strMatch, "ShipHealth") and string.find(strMatch, "<") then					
							-- TrigChanged = true
							-- -- print("DcCS passe 03 strMatch/not/ShipHealth "..tostring(strMatch))
							
							-- two = tonumber(two) * mission_ini.Slider_CampaignDuration							
							-- if two >= 100 then
								-- print()
								-- print("********************ATTENTION******************")
								-- print(" "..tostring(strMatch))
								-- print("*************** Slider_CampaignDuration: attention, the induced percentage exceeds 100%.****************")
								-- print("********************ATTENTION******************")
								-- print()
								-- os.execute 'pause'								
								-- two = 90								
							-- elseif two <= 0 then							
								-- two = 2							
							-- end
						end

						if TrigChanged  then
							trig.condition = ""
							tempConcat = one.." <"..stringEgal .." ".. tostring(two).." "
							
							if string.find(s, " and ") then stringAnd = " and " end
							if trig.condition ~= "" then
								trig.condition = trig.condition..stringAnd..tempConcat
							else
								trig.condition = tempConcat
							end
							--sauvegarde l'etat initial de la condition pour pouvoir la remetre 
							if not trig.InitCondition then
								trig.InitCondition = s
							end
						end
						
					elseif mission_ini.Slider_CampaignDuration == false and trig.InitCondition then
						trig.condition = trig.InitCondition
					end
				end					
				-- print("DcCS AFTER  "..tostring(trig.condition))					
				break
			end
		end
	end
end


--[[
	change le nombre d'avion de reserve, plus il y en a, et plus la campagne dura
	
	on se base pour une valeur 3 qui correspond aux valeurs de depart de Cef
	
	garde la retroCompatibilité entre les escadron Reserves et la ligne reserve d'un escadron active
]]--
for side,unit in pairs(oob_air) do
	for n = 1, #unit do
		--crée la nouvelle clef transfert 
		if not unit[n].roster.trans then 
			unit[n].roster.trans = 0
		end
		if mission_ini.Slider_CampaignDuration and type(mission_ini.Slider_CampaignDuration == "number") then
			if unit[n].base == 'Reserves' then
				
				--créer une clef init qui fera reference, puisque l'on touchera à celui reserve
				if not unit[n].InitNumber then 
					unit[n].InitNumber = unit[n].number
				end										
				unit[n].roster.ready =  math.ceil(( unit[n].InitNumber/3) * mission_ini.Slider_CampaignDuration) - unit[n].roster.trans
			elseif unit[n].reserve then
			
				--créer une clef init qui fera reference, puisque l'on touchera à celui reserve
				if not unit[n].InitReserve then 
					unit[n].InitReserve = unit[n].reserve
				end			
				unit[n].roster.reserve =  math.ceil(( unit[n].InitReserve/3) * mission_ini.Slider_CampaignDuration) - unit[n].roster.trans
			end
		elseif mission_ini.Slider_CampaignDuration == false then		--retabli les valeurs d'origine si le joueur le souhaite
			
			local transfert = 0
			if unit[n].roster.trans then
				transfert = unit[n].roster.trans
			end

			
			if unit[n].base == 'Reserves'  then
				--créer une clef init qui fera reference, puisque l'on touchera à celui reserve
				if not unit[n].InitNumber then 
					unit[n].InitNumber = unit[n].number
				end
				unit[n].roster.ready = unit[n].InitNumber - transfert
			elseif unit[n].reserve  then	
				--créer une clef init qui fera reference, puisque l'on touchera à celui reserve
				if not unit[n].InitReserve then 
					unit[n].InitReserve = unit[n].reserve
				end	
				unit[n].roster.reserve =   unit[n].InitReserve - transfert
			end
		end
	end
end
-- end

--[[
PARTIE Slider_EnemyLevel ***************************************************************************
]]--
for side , oob_airSide in pairs(oob_air) do														--pour afficher l'exemple de selection du premier avion présenté
	for m , unit in pairs(oob_airSide) do
		if unit.player  then
			TypePlanePlayer = unit.type
			SidePlayer = side
		end
	end
end



-- par défaut, on assigne une valeur superieur au camp du joueur, qu'il soit rouge ou bleu.
skillWish = {
	["red"] = 50,
	["blue"] = 50,
}

for side, wish in pairs(skillWish) do
	if side == SidePlayer then
		skillWish[side] = 62 
		-- print("DcCS side:  "..side.." |skillWish: "..tostring(skillWish[side]))
	else
		skillWish[side] = 50
	end
end


if mission_ini.Slider_EnemyLevel and type(mission_ini.Slider_EnemyLevel == "number") then
	-- print()
	-- print()
	-- print("DcCSPARTIE Slider_EnemyLevel ***************************************************************************")
	-- print("DcCS Slider_EnemyLevel:  "..tostring(mission_ini.Slider_EnemyLevel))
	
	for side, wish in pairs(skillWish) do		
		--change la valeur Skill
		if side == SidePlayer then
			-- 1 (easy player)		70
			-- 4 (very difficult)	55
			skillWish[side] = ((-5 * mission_ini.Slider_EnemyLevel) + 75) 									--change la valeur Skill du camp 
		else
			-- 1 (easy player)		30
			-- 4 (very difficult)	60
			skillWish[side] = ((10 * mission_ini.Slider_EnemyLevel) + 20)											--change la valeur Skill du camp adverse
		end		
		
		if skillWish[side] < 0 then
			skillWish[side] = 0
		elseif skillWish[side] > 100 then
			skillWish[side] = 100
		end
		-- print("DcCS AFTER Skill "..tostring(side).." "..tostring(skillWish[side]))
	end
end	
	--[[
		change le nombre d'avion ENI disponible, plus il y en a, et plus ce sera difficile
		1	0.8
		2	0.9
		3	1
		4	1.3 (1.4)
		
		https://www.dcode.fr/recherche-equation-fonction
		0.13x+0.65
	]]--
	
for side,unit in pairs(oob_air) do
	if side ~= SidePlayer then
		for n = 1, #unit do
			if not unit[n].roster.trans then 
				unit[n].roster.trans = 0
			end
			if unit[n].reserve then
				--créer une clef init qui fera reference, puisque l'on touchera à celui reserve
				if not unit[n].InitNumber then 
					unit[n].InitNumber = unit[n].number
				end
				
				if mission_ini.Slider_EnemyLevel and type(mission_ini.Slider_EnemyLevel == "number") then
	
					--change la valeur ready:
					unit[n].roster.ready =  math.floor( unit[n].InitNumber * (mission_ini.Slider_EnemyLevel * 0.19 + 0.55)) - unit[n].roster.lost  - unit[n].roster.damaged + unit[n].roster.trans					
					--change la valeur number, qui sert de reference pour le recompletement
					unit[n].number =  math.floor( unit[n].InitNumber * (mission_ini.Slider_EnemyLevel * 0.19 + 0.55))														
				elseif  mission_ini.Slider_EnemyLevel == false then					
					
					
					--change la valeur ready:
					unit[n].roster.ready =   unit[n].InitNumber  - unit[n].roster.lost  - unit[n].roster.damaged + unit[n].roster.trans					
					--change la valeur number, qui sert de reference pour le recompletement
					unit[n].number =  unit[n].InitNumber					
				end
			end												
		end
	end
end	

-- local test_str = "camp_triggers = " .. TableSerialization(camp_triggers, 0)						--make a string
-- local testFile = io.open("Debug/DcCS__camp_triggers.lua", "w")								--open targetlist file
-- testFile:write(test_str)															--save new data
-- testFile:close()


-- os.execute 'pause'