--========================== RELIEF SUPPLY EVENT ==========================--
--Relief Supply sẽ ngẫu nhiên drop hàng tiếng. Tỉ lệ giảm dần theo tuổi của thế giới
--Sau 7 ngày mới xuất hiện sự kiện này
--Thông báo trên Radio các Supply đã drop và chưa bị loot 3 tiếng 1 lần. 
--Nếu Crate bị loot, sẽ được cập nhật cho player khi thông báo trên Radio 3 tiếng 1 lần. Có khả năng Supply đã bị loot trong 3 tiếng này, đến lúc nhận thông báo trên Radio mới cập nhật hiển thị Quest List
--Luôn có tỉ lệ bị NPC loot, thời gian Drop càng lâu thì tỉ lệ càng lớn
--Có 3 loại Supply: Thực phẩm, Dược phẩm, Vũ khí
	--Loại item và số lượng ngẫu nhiên
--Để nghe được tin tức thì luôn phải có Radio đang bật và cầm trên tay hoặc đứng trong khu vực có thể nghe được tiếng Radio đang bật. 
	--Radio chỉ cần bật, bất kì tần số MHz nào cũng có thể nhận tin
	--Player ngủ không thể nghe được tin
--CALL EVENT ngay lập tức: VLERS.TryTriggerReliefSupply(true)
--=========================================================================--

--[[ XOÁ SUPPLYID CỤ THỂ
local questMD = VLGMD.GetQuestGlobalModData(nil)
questMD.Events["ReliefSupply"][21121] = nil
questMD.Events["ReliefSupply"][21601] = nil
]]

require "vl_quest_utils"
require "vl_quest_player_utils"
require "vl_quest_globalmoddata"

VLERS = VLERS or {}
VLERS.displaySupplyOnQuestList = {}

local GetQuestGlobalModData = VLGMD.GetQuestGlobalModData
local GetPlayerGlobalModData = VLGMD.GetPlayerGlobalModData
local PlayerCanHearAnyRadio = VLPL.PlayerCanHearAnyRadio
local PlaySound = VLF.PlaySound
local StopSound = VLF.StopSound
local PlaySoundFadeIn = VLF.PlaySoundFadeIn
local DelayFunctionByMinute = VLF.DelayFunctionByMinute
 
local qtype = getText("IGUI_VLQ_TimeLimitedEvent")
local questMarker = getTexture("media/textures/reliefsupplydrop_64.png")
VLERS.cSprite = "location_military_generic_01_8"
local cSprite = VLERS.cSprite
VLERS.requiredHoursToStartEvent = 168
 
--Lấy Global ModData cho sự kiện ReliefSupply
function VLERS.GetModDataReliefSupplyEvent()	--local questMD_Events_ReliefSupply = VLERS.GetModDataReliefSupplyEvent()
	local questMD = GetQuestGlobalModData(nil)
	questMD.Events["ReliefSupply"] = questMD.Events["ReliefSupply"] or {}
	
	return questMD.Events["ReliefSupply"]
end
local GetModDataReliefSupplyEvent = VLERS.GetModDataReliefSupplyEvent

--Cập nhật ModData sau khi spawned Crate event
function VLERS.UpdateSpawnedData(supplyID, spawned, addedX, addedY, addedZ)	
	local questMD_Events_ReliefSupply = GetModDataReliefSupplyEvent()
	local supplyData = questMD_Events_ReliefSupply[supplyID]
	if not supplyData then return end
	
	supplyData.spawned = spawned
	supplyData.addedX = addedX
	supplyData.addedY = addedY
	supplyData.addedZ = addedZ
	
	if isServer() then
		sendServerCommand("Event_ReliefSupply_C", "UpdateSpawned_C", {supplyID = supplyID, spawned = spawned, addedX = addedX, addedY = addedY, addedZ = addedZ})
	end
end

--Xóa Global ModData của supplyID
function VLERS.RemoveGMDSupplyID(supplyID, transmit)
	transmit = transmit or false
	local questMD_Events_ReliefSupply = GetModDataReliefSupplyEvent()
	questMD_Events_ReliefSupply[supplyID] = nil
	
	if transmit then
		if isClient() then
			sendClientCommand(getPlayer(), "Event_ReliefSupply", "RemoveDataSupplyID", {supplyID = supplyID})
		end
		if isServer() then
			sendServerCommand("Event_ReliefSupply_C", "RemoveDataSupplyID_C", {supplyID = supplyID})
		end
	end
	
	--print("Shared---RemoveGMDSupplyID---supplyID= ", supplyID)
end
local RemoveGMDSupplyID = VLERS.RemoveGMDSupplyID

function VLERS.GetPlayerGMDReliefSupply(player, supplyID)	--local playerGMD_Data_knewReliefSupplys = VLERS.GetPlayerGMDReliefSupply(player, supplyID)
	local playerGMD = GetPlayerGlobalModData(player)
	if not playerGMD.Data["knewReliefSupplys"] then playerGMD.Data["knewReliefSupplys"] = {} end
	
	if supplyID then
		if not playerGMD.Data["knewReliefSupplys"][supplyID] then playerGMD.Data["knewReliefSupplys"][supplyID] = {} end
	end
	
	return playerGMD.Data["knewReliefSupplys"]
end
local GetPlayerGMDReliefSupply = VLERS.GetPlayerGMDReliefSupply

--Cập nhật data khi player đã nghe được tin tức về Supply
function VLERS.UpdatePlayerGMDKnewReliefSupply(player, supplyID)
	local playerGMD_Data_knewReliefSupplys = GetPlayerGMDReliefSupply(player, supplyID)
	local questMD_Events_ReliefSupply = GetModDataReliefSupplyEvent()
	local supplyData = questMD_Events_ReliefSupply[supplyID]
	
	--print("Shared---UpdatePlayerGMDKnewReliefSupply---supplyID= ", supplyID)
	playerGMD_Data_knewReliefSupplys[supplyID]["active"] = true
	playerGMD_Data_knewReliefSupplys[supplyID]["x"] = supplyData.x
	playerGMD_Data_knewReliefSupplys[supplyID]["y"] = supplyData.y
	playerGMD_Data_knewReliefSupplys[supplyID]["supplyTypeID"] = supplyData.supplyTypeID
	playerGMD_Data_knewReliefSupplys[supplyID]["activateStartHour"] = supplyData.activateStartHour
	
	if isClient() then
		sendClientCommand(player, "Event_ReliefSupply", "UpdatePlayerGMDRS", {supplyID = supplyID})
	end
end
local UpdatePlayerGMDKnewReliefSupply = VLERS.UpdatePlayerGMDKnewReliefSupply

--Server Only --Xóa ModData của Crate Event
function VLERS.RemoveCrateModData(obj)
	if not obj then return end
	--print("Server---RemoveCrateModData---Removed ModData Of Crate ReliefSupply---supplyID= ", obj:getModData().VL_ReliefSupplyID)
	obj:getModData().VL_ReliefSupplyID = nil
	obj:transmitModData()
end
local RemoveCrateModData = VLERS.RemoveCrateModData

--Cập nhật ModData sau khi Crate event bị lấy mất. --Xóa modData Crate. --Xóa data supplyID nếu player looted
function VLERS.UpdateSupplyLootedData(supplyID, transmit, isLootedByPlayer)
	transmit = transmit or false
	isLootedByPlayer = isLootedByPlayer or false
	local questMD_Events_ReliefSupply = GetModDataReliefSupplyEvent()
	local supplyData = questMD_Events_ReliefSupply[supplyID]
	if not supplyData then return end
	
	supplyData.looted = true
	
	if isLootedByPlayer then
		supplyData.lootedByPlayer = true
	end

	--SP hoặc SERVER
	if not isClient() then
		--Xóa modData của Crate NẾU đang load
		local x, y, z = supplyData.addedX, supplyData.addedY, supplyData.addedZ
		if x and y and z then
			local sq = getCell():getGridSquare(supplyData.addedX, supplyData.addedY, supplyData.addedZ)
			if sq then
				local objs = sq:getObjects()
				for i = 0, objs:size() - 1 do
					local obj = objs:get(i)
					if obj and obj:getSprite() and obj:getSprite():getName() == cSprite then
						if obj:getModData() and obj:getModData().VL_ReliefSupplyID == supplyID then
							RemoveCrateModData(obj)
						end
					end
					
				end
			end
		end
		
		--Xóa modData của supplyID nếu là player loot
		if isLootedByPlayer == true then
			RemoveGMDSupplyID(supplyID, true)
		else
			--Xóa modData supplyID nếu NPC loot và chưa spawn Crate
			if not supplyData.spawned then
				RemoveGMDSupplyID(supplyID, true)
			end
		end
	end
	
	if transmit then
		if isClient() then
			sendClientCommand(getPlayer(), "Event_ReliefSupply", "SupplyLooted", {supplyID = supplyID, isLootedByPlayer = isLootedByPlayer})
		end
		if isServer() then
			sendServerCommand("Event_ReliefSupply_C", "SupplyLooted_C", {supplyID = supplyID, isLootedByPlayer = isLootedByPlayer})
		end
	end
end
	
--Lưu dữ liệu cho SupplyID để thêm vào square khi square được load
function VLERS.RegisterReliefCrateSpawn(x, y, supplyID, supplyTypeID, crateSprite, activateStartHour, itemFNameList, instantSpawn)
	local questMD_Events_ReliefSupply = GetModDataReliefSupplyEvent()
	questMD_Events_ReliefSupply[supplyID] = {
		x = x,
		y = y,
		supplyTypeID = supplyTypeID,
		crateSprite = crateSprite,
		activateStartHour = activateStartHour,
		itemFNameList = itemFNameList,
		instantSpawn = instantSpawn,
		spawned = false,
		looted = false
	}
	
	if isServer() then
		sendServerCommand("Event_ReliefSupply_C", "RegisterDataSpawn_C", {
			supplyID = supplyID,
			x = x,
			y = y,
			supplyTypeID = supplyTypeID,
			crateSprite = crateSprite,
			activateStartHour = activateStartHour,
			itemFNameList = itemFNameList,
			instantSpawn = instantSpawn,
			spawned = false,
			looted = false
		})
	end
end

--Thêm hiển thị trên Quest List
local function EventRS_QuestList_AddItem(text, itemData) --EventRS_QuestList_AddItem("Q"..tostring(id), {id = id, qStep = qStep, isDone = isDone, qtype = qtype, isCollection = isCollection, currentCollection = currentCollection, requestCollection = requestCollection, name = getText("IGUI_VLQ_"..tostring(id).."_Name"), task = getText("IGUI_VLQ_"..tostring(id).."_Task_"..tostring(qStep)), desc = getText("IGUI_VLQ_"..tostring(id).."_Desc_"..tostring(qStep))})
    if not text or not itemData then return end
	local id,qStep  = itemData.id, itemData.qStep
	local isDone = itemData.isDone or false
	local isCollection, currentCollection, requestCollection = itemData.isCollection or false, itemData.currentCollection, itemData.requestCollection
	local collectQItemName = itemData.collectQItemName or nil
	local qtype = itemData.qtype or getText("IGUI_VLQ_TimeLimitedEvent")
	if not id or not qStep then return end
	
    VLF.QuestListShowOnUI[text] = {id = id, qStep = qStep, isDone = isDone, qtype = qtype, isCollection = isCollection, currentCollection = currentCollection, requestCollection = requestCollection, collectQItemName = collectQItemName, name = itemData.name, task = itemData.task, desc = itemData.desc}
end

--USING quest ID ERS1 -> ERSxxx
local function EventRS_DoQuestList_AddItem(args) --EventRS_DoQuestList_AddItem({id = 1, qStep = "q1s003", isDone = false, qtype = getText("IGUI_VLQ_MainQuest"), supplyID = supplyID, elapsedHours = elapsedHours, supplyTypeID = supplyTypeID})
	local id, qStep = args.id, args.qStep
	if not id or not qStep then return end
	
	local supplyID = args.supplyID
	local supplyTypeID = args.supplyTypeID
	local supplyType = getText("IGUI_VLQ_ReliefSupply_Weapon")
	if supplyTypeID == 1 then
		supplyType = getText("IGUI_VLQ_ReliefSupply_Food")
	elseif supplyTypeID == 2 then
		supplyType = getText("IGUI_VLQ_ReliefSupply_Medical")
	end
	
	EventRS_QuestList_AddItem("Q"..tostring(id), {id = id, qStep = qStep, isDone = args.isDone, qtype = args.qtype, name = getText("IGUI_VLQ_ReliefSupply_Name", args.supplyID), task = getText("IGUI_VLQ_ReliefSupply_Task", supplyType), desc = getText("IGUI_VLQ_ReliefSupply_Desc", supplyType, args.elapsedHours)})
end

--Function cố định để show event trên bảng Quest List
function VLERS.AddToQuestList(player, supplyID)
	local playerGMD_Data_knewReliefSupplys = GetPlayerGMDReliefSupply(player)
	local sData = playerGMD_Data_knewReliefSupplys[supplyID]
	if not sData then return end
	
	local id = "ERS" .. tostring(supplyID)
	local qStep = "q" .. id .. "s001"
	
	local currentHour = getGameTime():getWorldAgeHours()
	local elapsedHours = math.floor(currentHour - (sData.activateStartHour or currentHour))
	local supplyTypeID = sData.supplyTypeID
	
	EventRS_DoQuestList_AddItem({id = id, qStep = qStep, isDone = false, qtype = qtype, supplyID = supplyID, elapsedHours = elapsedHours, supplyTypeID = supplyTypeID})
	VLF.MarkerList_Add({qStep = qStep, x = sData.x, y = sData.y, texture = questMarker, supplyID = supplyID})
end
local AddToQuestList = VLERS.AddToQuestList

--Xóa hiển thị trên Quest List
local function EventRS_QuestList_RemoveItem(text) --EventRS_QuestList_RemoveItem("Q".."ERS"..tostring(supplyID))
    if not text then return end
    if VLF.QuestListShowOnUI[text] then
        VLF.QuestListShowOnUI[text] = nil
    end
end

--Xóa hiển thị trên Quest List --CLIENT only
function VLERS.EventRS_RemoveQuestList(supplyID, state)
	local player = getPlayer()
	if not player then return end
	state = state or ""
	
	local playerGMD_Data_knewReliefSupplys = GetPlayerGMDReliefSupply(player)
	if playerGMD_Data_knewReliefSupplys[supplyID] and playerGMD_Data_knewReliefSupplys[supplyID]["active"] == true then
		playerGMD_Data_knewReliefSupplys[supplyID] = nil
		VLERS.displaySupplyOnQuestList[supplyID] = nil
		EventRS_QuestList_RemoveItem("Q" .. "ERS" .. tostring(supplyID))
		VLF.MarkerList_Remove("q" .. "ERS" .. tostring(supplyID) .. "s001")
		
		--Popup
		VLF.QuestUpdatedPopIn("radio_RS", state)
	end
end
local EventRS_RemoveQuestList = VLERS.EventRS_RemoveQuestList
 
--Player đang nghe được radio thì hiện quest, hiện halo --SP + Client
--Khi gửi radio các supply được thả, các supplyID đang hiển thị quest list không còn trong tin tức thì xóa trên Quest List
function VLERS.BroadCastAboutSupplyDropped(player, supplyID)
	if not player and not supplyID then return end
 
	--Nếu player nghe được tiếng Radio
	local isCanHear, radio = PlayerCanHearAnyRadio(player)
	if isCanHear == true then
		local playerGMD_Data_knewReliefSupplys = GetPlayerGMDReliefSupply(player)
		
		local questMD_Events_ReliefSupply = GetModDataReliefSupplyEvent()
		local supplyData = questMD_Events_ReliefSupply[supplyID]
		if not supplyData then return end
		
		--Nếu nghe tin supply bị lấy thì XÓA quest list, hiển thị popup, halo báo supply đã có người mở ra
		if supplyData.looted == true then
			--print("Shared---BroadCastAboutSupplyDropped---Heard News Supply Looted By Others---supplyID= ", supplyID)
			
			--Nếu đang hiển thị trong bảng Quest List
			if playerGMD_Data_knewReliefSupplys[supplyID] and playerGMD_Data_knewReliefSupplys[supplyID]["active"] then 
				--Xóa hiển thị Quest List
				EventRS_RemoveQuestList(supplyID, "looted")

				--show Halo text 
				HaloTextHelper.addBadText(player, getText("IGUI_VLQ_ReliefSupply_SomeoneLooted", supplyID))
			end

		else	--Nếu chưa bị lấy
			--Nếu supplyID này chưa từng nghe được tin tức THÌ show Quest List và update Data
			if not playerGMD_Data_knewReliefSupplys[supplyID] then
				print("Shared---BroadCastAboutSupplyDropped---Heard News Supply Dropped---supplyID= ", supplyID)
				--update ModData Player đã nghe được tin tức
				UpdatePlayerGMDKnewReliefSupply(player, supplyID)
				
				--Tạo function theo supplyID để show trên Quest List
				VLERS.displaySupplyOnQuestList[supplyID] = AddToQuestList
				--Popup
				VLF.QuestUpdatedPopIn("radio_RS")
		
				--hiện HaloTextHelper
				HaloTextHelper.addGoodText(player, getText("IGUI_VLQ_ReliefSupply_GetNews"))
				
				
			--else
				--print("Shared---BroadCastAboutSupplyDropped---KNEW ABOUT THIS SUPPLY---supplyID= ", supplyID)
			end

		end

	end
end

--Kiểm tra lại toàn bộ supplyID đang hiển thị Quest List. Cái nào không có trong questMD_Events_ReliefSupply HOẶC looted == true thì xóa
function VLERS.RemoveSupplysQuestList()
	local player = getPlayer()
	if not player then return end
	
	--Nếu player nghe được tiếng Radio
	local isCanHear, radio = PlayerCanHearAnyRadio(player)
	if isCanHear == true then
		local questMD_Events_ReliefSupply = GetModDataReliefSupplyEvent()
		
		--Duyệt tất cả supplyID đang hiển thị Quest List
		for supplyID, _ in pairs(VLERS.displaySupplyOnQuestList) do
			
			--Nếu supplyID này không tồn tại trong questMD_Events_ReliefSupply -> Xóa
			--Hoặc nếu supplyID looted == true -> Xóa
			local supplyData = questMD_Events_ReliefSupply[supplyID]
			
			if not supplyData or (supplyData and supplyData["looted"] == true) then
				--print("------XOA-----supplyID, supplyData.looted= ", supplyID, supplyData and supplyData["looted"] == true or nil)
				EventRS_RemoveQuestList(supplyID, "looted")
				
				if not isServer() then
					HaloTextHelper.addBadText(player, getText("IGUI_VLQ_ReliefSupply_SomeoneLooted", supplyID))
				end
			end
		end

	--else
		--print("------RemoveSupplysQuestList-----KHONG NGHE DUOC RADIO")
	end
end 

--Client nào đang load square thì mới play sound Helicopter
function VLERS.PlaySound_Helicopter(x, y)
	if not x or not y then return end
	
	local sq = getCell():getGridSquare(x, y, 0)
	if not sq then return end
	
	local player = getPlayer()
	if not player then return end
	
	--PlaySound(player, "Helicopter")
	PlaySoundFadeIn(player, "Helicopter", 300)
	
	DelayFunctionByMinute(function()
		StopSound(player, "Helicopter")
	end, 5)
end








