CaveBot.Extensions.Depositor = {}

--local variables
local destination = nil
local lootTable = nil
local reopenedContainers = false

local function resetCache()
	reopenedContainers = false
	destination = nil
	lootTable = nil

	for i, container in ipairs(getContainers()) do
		if container:getName():lower():find("depot") or container:getName():lower():find("locker") then
			g_game.close(container)
		end
	end

	if storage.caveBot.backStop then
		storage.caveBot.backStop = false
		CaveBot.setOff()
	elseif storage.caveBot.backTrainers then
		storage.caveBot.backTrainers = false
		CaveBot.gotoLabel('toTrainers')
	elseif storage.caveBot.backOffline then
		storage.caveBot.backOffline = false
		CaveBot.gotoLabel('toOfflineTraining')
	end
end

local description = g_game.getClientVersion() > 960 and "No - just deposit \n Yes - also reopen loot containers" or "currently not supported, will be added in near future"

CaveBot.Extensions.Depositor.setup = function()
	CaveBot.registerAction("depositor", "#002FFF", function(value, retries)
		-- version check, TODO old tibia
		if g_game.getClientVersion() < 960 then
			resetCache()
			warn("CaveBot[Depositor]: unsupported Tibia version, will be added in near future")
			return false
		end

		-- loot list check
		lootTable = lootTable or CaveBot.GetLootItems()
		if #lootTable == 0 then
			print("CaveBot[Depositor]: no items in loot list. Wrong TargetBot Config? Proceeding")
			resetCache()
			return true
		end

		delay(70)

		-- backpacks etc
		if value:lower() == "yes" then
			if not reopenedContainers then
				CaveBot.CloseAllLootContainers()
				delay(3000)
				reopenedContainers = true
				return "retry"
			end
			-- open next backpacks if no more loot
			if not CaveBot.HasLootItems() then
				local lootContainers = CaveBot.GetLootContainers()
				for _, container in ipairs(getContainers()) do
					local cId = container:getContainerItem():getId()
					if table.find(lootContainers, cId) then
						for i, item in ipairs(container:getItems()) do
							if item:getId() == cId then
								g_game.open(item, container)
								delay(100)
								return "retry"
							end
						end
					end
				end
				-- couldn't find next container, so we done
				print("CaveBot[Depositor]: all items stashed, no backpack to open next, proceeding")
				CaveBot.CloseAllLootContainers()
				delay(3000)
				resetCache()
				return true
			end
		end

		-- first check items
		if retries == 0 then
			if not CaveBot.HasLootItems() then -- resource consuming function
				print("CaveBot[Depositor]: no items to stash, proceeding")
				resetCache()
				return true
			end
		end

		-- next check retries
		if retries > 400 then 
			print("CaveBot[Depositor]: Depositor actions limit reached, proceeding")
			resetCache()
			return true 
		end

		-- reaching and opening depot 
		if not CaveBot.ReachAndOpenDepot() then
			return "retry"
		end

		-- add delay to prevent bugging
		CaveBot.PingDelay(2)

		-- prep time and stashing
		destination = destination or getContainerByName("Depot chest")
		if not destination then return "retry" end

		for _, container in pairs(getContainers()) do
    	    local name = container:getName():lower()
    	    if not name:find("depot") and not name:find("your inbox") then
    	        for _, item in pairs(container:getItems()) do
    	            local id = item:getId()
					if table.find(lootTable, id) then
						local index = getStashingIndex(id) or item:isStackable() and 1 or 0
						statusMessage("[Depositer] stashing item: " ..id.. " to depot: "..index+1)
						CaveBot.StashItem(item, index, destination)
						return "retry"
					end
				end
			end
		end

		-- we gucci
		return true
	end)

	CaveBot.Editor.registerAction("depositor", "depositor", {
	 value="no",
	 title="Depositor",
	 description=description,
	 validation="(yes|Yes|YES|no|No|NO)"
	})
end