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

DB.version=0.03

DB.dataDefault = {
    data = {}
}

DB.UI_Movable=false

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 )

	--Всё подгружается из базы, скроллится и перемещается.
	--Минусы: некликабельные строки, нет картинок, неудобное восприятие информации

	-- Полезные функции:
	--		Можно получить иконку и стоимость
	-- 		GetItemLinkInfo(string itemLink)
	--
	--		Отображение тултипа из базы (/script d(db_UI.Tooltip:SetLink(DB.items.data[2].name)))
	--		SetLink(string aLink)

	--Инициализация графического интерфейся
	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.TB = WINDOW_MANAGER:CreateControl("DBUI_TB",DBUI,CT_TEXTBUFFER)
	db_UI.Slider = WINDOW_MANAGER:CreateControl("DBUI_Slider",DBUI_TB,CT_SLIDER)
	db_UI.Tooltip = WINDOW_MANAGER:CreateControl("DBUI_Tooltip",DBUI,CT_TOOLTIP)
	db_UI.Button_Guild = WINDOW_MANAGER:CreateControl("DBUI_BtG",DBUI,CT_BUTTON)
	db_UI.Button_Player = WINDOW_MANAGER:CreateControl("DBUI_BtP",DBUI,CT_BUTTON)
	db_UI.Button_MoveOff = WINDOW_MANAGER:CreateControl("DBUI_MO",DBUI,CT_BUTTON)

	--Обработчики событий
	--Прокрутка слайдера и буфера колёсиком
	db_UI:SetHandler("OnMouseWheel",
	function(self,delta)
		db_UI.TB:SetScrollPosition(DBUI_TB:GetScrollPosition() + delta)
		db_UI.Slider:SetValue(db_UI.Slider:GetValue()- delta)
	end)

    -- Клик по гильдии
    db_UI.Button_Guild:SetHandler( "OnClicked" , function(self)
    	db_UI.TB:Clear()
    	DB.DisplayGuildBank()
    end )

    -- Клик по игроку
    db_UI.Button_Player:SetHandler( "OnClicked" , function(self)
    	db_UI.TB:Clear()
    	DB.DisplayPlayerBank()
    end )

    -- Клик по M
    db_UI.Button_MoveOff:SetHandler( "OnClicked" , function(self)
    	if DB.UI_Movable then
    		db_UI:SetMovable(true)
    		DB.UI_Movable=false
    	else
    		db_UI:SetMovable(false)
    		DB.UI_Movable=true
    	end
    end )

	--Общие настройки интерфейса
	db_UI:SetAnchor(TOPLEFT,GuiRoot,TOPLEFT,10,10)
	db_UI:SetDimensions(300,245)
	db_UI:SetMouseEnabled(true)

    if DB.UI_Movable then
		db_UI:SetMovable(true)
		DB.UI_Movable=false
	else
		db_UI:SetMovable(false)
		DB.UI_Movable=true
	end

	--Фон
	db_UI.BG:SetDimensions(300,245)
	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( "|cff8000Bank Storage|" )
	db_UI.Title:SetAnchor(TOP,DBUI,TOP,0,0)

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

	--Текстовый буфер
	db_UI.TB:SetDimensions(275,200)
	db_UI.TB:SetFont( "ZoFontGame" )
	db_UI.TB:SetAnchor(BOTTOM,DBUI,BOTTOM,0,-5)
	db_UI.TB:SetLinkEnabled(true)

	--Подсказка
	-- db_UI.Tooltip:SetDimensions(425,345)
	-- db_UI.Tooltip:SetFont( "ZoFontGame" )
	-- db_UI.Tooltip:SetAnchor(BOTTOM,DBUI,BOTTOM,50,50)

	--Слайдер
	-- /script db_UI.Slider:SetBackgroundBottomTexture("", 8, 1, 1)
	local tex = "/esoui/art/miscellaneous/scrollbox_elevator.dds"

    db_UI.Slider:SetWidth(22)
	db_UI.Slider:SetOrientation(ORIENTATION_VERTICAL)
	db_UI.Slider:SetThumbTexture(tex, tex, tex, 22, 100, 0, 0, 1, 1)
	db_UI.Slider:SetAnchor(BOTTOMRIGHT,db_UI,BOTTOMRIGHT,0,0)
	db_UI.Slider:SetMouseEnabled(true)
	db_UI.Slider:SetHeight(245)
	db_UI.Slider:SetValueStep(1)

	-- Кнопка "Гильдия"
	db_UI.Button_Guild:SetText("[Guild]")
	db_UI.Button_Guild:SetAnchor(TOP,DBUI,TOPRIGHT,-150,20)
	db_UI.Button_Guild:SetDimensions(70,25)
	db_UI.Button_Guild:SetFont("ZoFontGameBold")
	db_UI.Button_Guild:SetNormalFontColor(0,255,255,.7)
	db_UI.Button_Guild:SetMouseOverFontColor(0.8,0.4,0,1)

	-- Кнопка "Игрок"
	db_UI.Button_Player:SetText("[Player]")
	db_UI.Button_Player:SetAnchor(TOP,DBUI,TOPRIGHT,-90,20)
	db_UI.Button_Player:SetDimensions(70,25)
	db_UI.Button_Player:SetFont("ZoFontGameBold")
	db_UI.Button_Player:SetNormalFontColor(0,255,255,.7)
	db_UI.Button_Player:SetMouseOverFontColor(0.8,0.4,0,1)

	-- Кнопка "M"
	db_UI.Button_MoveOff:SetText("[M]")
	db_UI.Button_MoveOff:SetAnchor(TOP,DBUI,TOPRIGHT,-40,20)
	db_UI.Button_MoveOff:SetDimensions(40,25)
	db_UI.Button_MoveOff:SetFont("ZoFontGameBold")
	db_UI.Button_MoveOff:SetNormalFontColor(0,255,255,.7)
	db_UI.Button_MoveOff:SetMouseOverFontColor(0.8,0.4,0,1)



	--Отображение
	db_UI.Items.Item={}
	db_UI.Items.Item.name ={}
	db_UI.Items.Item.count ={}

	function DB.DisplayGuildBank()
		if (#DB.items.data==0) then return end

		--Обновляем изменяемые значения
		db_UI.Items:SetText("ItemsTotal: "..#DB.items.data)
		db_UI.Slider:SetMinMax(1,#DB.items.data)
    	db_UI.Slider:SetValue(#DB.items.data)
		db_UI.TB:SetMaxHistoryLines(#DB.items.data)
		db_UI.TB:SetScrollPosition(0)

		--Прокрутка буфера ползунком слайдера
		db_UI.Slider:SetHandler("OnValueChanged",
		function(self, val, eventReason)
	       db_UI.TB:SetScrollPosition(#DB.items.data-val)
	    end)

		for i=1, #DB.items.data, 1 do
			db_UI.TB:AddMessage(i.."|| "..DB.items.data[i].count.." || "..DB.items.data[i].name)

			-- --Название
			-- 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,DBUI,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,DBUI,TOPLEFT,300,20+i*20)

		end
	end


	function DB.DisplayPlayerBank()
		DB.ItemCounter=0
		local RealItemNumber=1
		bagIcon, bagSlots=GetBagInfo(BAG_BANK)

		while (DB.ItemCounter < bagSlots) do
			if GetItemName(BAG_BANK,DB.ItemCounter)~="" then
				db_UI.TB:AddMessage(RealItemNumber.." : "..GetItemLink(BAG_BANK,DB.ItemCounter).." : "..GetSlotStackSize(BAG_BANK,DB.ItemCounter))
				RealItemNumber=RealItemNumber+1
			end
			DB.ItemCounter=DB.ItemCounter+1
		end

		--Обновляем изменяемые значения
		db_UI.Items:SetText("ItemsTotal: "..RealItemNumber-1)
		db_UI.Slider:SetMinMax(1,RealItemNumber-1)
    	db_UI.Slider:SetValue(RealItemNumber-1)
		db_UI.TB:SetMaxHistoryLines(RealItemNumber-1)
		db_UI.TB:SetScrollPosition(0)

		--Прокрутка буфера ползунком слайдера
		db_UI.Slider:SetHandler("OnValueChanged",
		function(self, val, eventReason)
	       db_UI.TB:SetScrollPosition((RealItemNumber-1)-val)
	    end)
	end
	DB.DisplayGuildBank()
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 (DB.ItemCounter < bagSlots) do
		if GetItemName(BAG_BACKPACK,DB.ItemCounter)~="" then
			d(DB.ItemCounter.." : "..GetItemName(BAG_BACKPACK,DB.ItemCounter).." : "..GetItemTotalCount(BAG_BACKPACK,DB.ItemCounter))
		end
		DB.ItemCounter=DB.ItemCounter+1
	end
	d("---------------------")
	d("Items total: "..(bagSlots-bagSpace))
	d("Slots counted: "..DB.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

			--Избавляемся от мусора при сохранении
			local namefine=string.gsub(GetItemLink(BAG_GUILDBANK,DB.ItemCounter), "(^p)", "")
			namefine=string.gsub(namefine, "(^n)", "")

			sv[#sv+1] =
					{
					 ["name"] = tostring(namefine),
					 ["count"] = tostring(GetSlotStackSize(BAG_GUILDBANK,DB.ItemCounter))
					}
		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)