--	DataBase v0.01
----------------------------
--	Список команд:
-- /db bag - список сумок
-- /db ic - список инвентаря
-- /db bc - список банка
----------------------------
DB = { }

DB.version=0.01

DB.dataDefault = {
    data = {}
}


local ShowInfo = true
local startupTS		= GetGameTimeMilliseconds()
local EventItemreadyHack=0

function DB.OnLoad(eventCode, addOnName)
	if (addOnName ~= "DataBase" ) then return end

	--добавляем команду
	SLASH_COMMANDS["/db"] = commandHandler

	--Регистрация эвентов
	EVENT_MANAGER:RegisterForEvent("DataBase", EVENT_OPEN_BANK, DB.PL_Opened)
	-- EVENT_MANAGER:RegisterForEvent("DataBase", EVENT_GUILD_BANK_SELECTED, DB.GB_Selected)
	EVENT_MANAGER:RegisterForEvent("DataBase", EVENT_OPEN_GUILD_BANK, DB.GB_Opened)
	EVENT_MANAGER:RegisterForEvent("DataBase", EVENT_GUILD_BANK_ITEMS_READY, DB.GB_Ready)

	--Загрузка сохраненных переменных (?)
	DB.items= ZO_SavedVars:New( "DB_SavedVars" , 2, "items" , DB.dataDefault , nil )

	-- Инициализация графического интерфейся
	db_UI = WINDOW_MANAGER:CreateTopLevelWindow("DBUI")
	db_UI.BG = WINDOW_MANAGER:CreateControl("DBUI_BG",DBUI,CT_BACKDROP)
	db_UI.Title = WINDOW_MANAGER:CreateControl("DBUI_Title",DBUI,CT_LABEL)
	db_UI.Items = WINDOW_MANAGER:CreateControl("DBUI_Items",DBUI,CT_LABEL)

	--Общие настройки интерфейса
	db_UI:SetDimensions(425,645)

	--Создаем скролл // слайдер

	-- Похоже слайдер придётся рисовать самому.. а при скроллинге только изменять значения 10-15 полей заранее созданых.
	--а может и нет.. надо бы глянуть текстуры.

	-- db_UI.Scroll = WINDOW_MANAGER:CreateControl("DBUI_Scroll",DBUI,CT_SCROLL)
	db_UI.Slider = WINDOW_MANAGER:CreateControl("DBUI_Slider",DBUI,CT_SLIDER)
	-- db_UI.Slider:DoesAllowDraggingFromThumb()
	-- /script d(db_UI.Slider:DoesAllowDraggingFromThumb())

	--	Фон
	db_UI.BG:SetDimensions( 425 , 645 )
	db_UI.BG:SetCenterColor(0,0,0,1)
	db_UI.BG:SetEdgeColor(0,0,0,1)
	db_UI.BG:SetEdgeTexture("", 8, 1, 1)
	db_UI.BG:SetAlpha(0.5)
	db_UI.BG:SetAnchor(BOTTOM,DBUI,BOTTOM,0,0)

	--	Заголовок
	db_UI.Title:SetFont("ZoFontGame" )
	db_UI.Title:SetColor(255,255,255,1.5)
	db_UI.Title:SetText( "GuildBank Storage" )
	db_UI.Title:SetAnchor(TOPLEFT,DBUI,TOPLEFT,10,0)

	--Применяем общие настройки
	db_UI:SetMouseEnabled(false)
	db_UI:SetMovable(true)

	--Выводим число вещей в инвентаре:
	db_UI.Items:SetFont("ZoFontGame" )
	db_UI.Items:SetColor(255,255,255,1.5)
	db_UI.Items:SetText("ItemsTotal: "..#DB.items.data)
	db_UI.Items:SetAnchor(TOPLEFT,DBUI,TOPLEFT,10,20)

	--Выводим название и число вещей на экран
	db_UI.Items.Item={}
	db_UI.Items.Item.name ={}
	db_UI.Items.Item.count ={}

	-- Если добавлять фильтры, выносить эту залупу ниже в функцию и скармливать ей заранее подготовленый массив
	-- for i=1, #DB.items.data, 1 do
	for i=1, 10, 1 do
		--Название
		db_UI.Items.Item.name[i] = WINDOW_MANAGER:CreateControl("DBUI_Item_name_"..i,DBUI,CT_LABEL)
		db_UI.Items.Item.name[i]:SetFont("ZoFontGame" )
		db_UI.Items.Item.name[i]:SetColor(255,255,255,1.5)
		db_UI.Items.Item.name[i]:SetText(DB.items.data[i].name)
		db_UI.Items.Item.name[i]:SetAnchor(TOPLEFT,db_UI,TOPLEFT,20,20+i*20)

		--Количество
		db_UI.Items.Item.name[i] = WINDOW_MANAGER:CreateControl("DBUI_Item_count_"..i,DBUI,CT_LABEL)
		db_UI.Items.Item.name[i]:SetFont("ZoFontGame" )
		db_UI.Items.Item.name[i]:SetColor(255,255,255,1.5)
		db_UI.Items.Item.name[i]:SetText(DB.items.data[i].count)
		db_UI.Items.Item.name[i]:SetAnchor(TOPLEFT,db_UI,TOPLEFT,300,20+i*20)
	end


end


function DB.Update(self)
-- Заготовка для обновления данных

end

function DB.PL_Opened()
	d("Player bank opened")
end

function DB.GB_Opened()
	d("Guild bank opened")
end

function DB.GB_Ready()
	--хак на срабатываение после второго события

	if EventItemreadyHack==1 then

		DB.gcount()

		EventItemreadyHack=0
	else
		EventItemreadyHack=1
	end
end

function DB.GB_Selected(guildid)
	d("Bank owned by "..guildid.." selected")
	DB.GuildBankId=GetSelectedGuildBankId()
	d("GuildBank id: "..DB.GuildBankId)
end


function commandHandler( text )
	if text=="ic" then
		DB.icount()
	elseif text=="bc" then
		DB.bcount()
	elseif text=="gc" then
		DB.gcount()
	else
		d("/db bag - bags list")
		d("/db ic - iventory list")
		d("/db bc - bank list")
		d("/db gc - guildbank list")
	end
end

function DB.icount()
	DB.ItemCounter=0
	bagIcon, bagSlots=GetBagInfo(BAG_BACKPACK)

	for i = bagSlots, 0, -1 do
		bagSpace = i
		if CheckInventorySpaceSilently(bagSpace) then break end
	end

	d("BagSpaceTotal: "..bagSlots)
	d("BagSpaceFree: "..bagSpace)
	d("BagSpaceOccupied: "..(bagSlots-bagSpace))
	d("slot:name:count")

	-- что-то тут не так...
	while (ItemCounter < bagSlots) do
		if GetItemName(BAG_BACKPACK,ItemCounter)~="" then
			d(ItemCounter.." : "..GetItemName(BAG_BACKPACK,ItemCounter).." : "..GetItemTotalCount(BAG_BACKPACK,ItemCounter))
		end
		ItemCounter=ItemCounter+1
	end
	d("---------------------")
	d("Items total: "..(bagSlots-bagSpace))
	d("Slots counted: "..ItemCounter)
end

function DB.bcount()
	DB.ItemCounter=0
	bagIcon, bagSlots=GetBagInfo(BAG_BANK)

	d("BagSpaceTotal: "..bagSlots)

	d("slot:name:count")
	while (DB.ItemCounter < bagSlots) do
		if GetItemName(BAG_BANK,DB.ItemCounter)~="" then
			d(DB.ItemCounter.." : "..GetItemName(BAG_BANK,DB.ItemCounter).." : "..GetSlotStackSize(BAG_BANK,DB.ItemCounter))
		end
		DB.ItemCounter=DB.ItemCounter+1
	end
	d("---------------------")
	d("Slots counted: "..DB.ItemCounter)
end

function DB.gcount()

    local data = {}
    local dataStr = ""
    local founditems = false

	--Обнуление сохраненной базы
    DB.items.data={}

	local sv = DB.items.data

	DB.ItemCounter=0
	bagIcon, bagSlots=GetBagInfo(BAG_GUILDBANK)

	while (DB.ItemCounter < bagSlots) do
		if GetItemName(BAG_GUILDBANK,DB.ItemCounter)~="" then
			d(DB.ItemCounter.." : "..GetItemLink(BAG_GUILDBANK,DB.ItemCounter).." : "..GetSlotStackSize(BAG_GUILDBANK,DB.ItemCounter))
			founditems=true

			if #sv == 0 then
				sv[1] =
						{
						 ["name"] = tostring(GetItemLink(BAG_GUILDBANK,DB.ItemCounter)),
						 ["count"] = tostring(GetSlotStackSize(BAG_GUILDBANK,DB.ItemCounter))
						}
			else
				sv[#sv+1] =
						{
						 ["name"] = tostring(GetItemLink(BAG_GUILDBANK,DB.ItemCounter)),
						 ["count"] = tostring(GetSlotStackSize(BAG_GUILDBANK,DB.ItemCounter))
						}
			end
		end
		DB.ItemCounter=DB.ItemCounter+1
	end
	d("---------------------")
	d("Slots counted: "..DB.ItemCounter)
	if DB.ItemCounter==bagSlots and founditems==false then
		d("Found nothing... try again")
	end
end


--Инициализация Аддона
EVENT_MANAGER:RegisterForEvent("DataBase", EVENT_ADD_ON_LOADED, DB.OnLoad)