---------------------------------------------------------------------------------
-- GLOBALS
---------------------------------------------------------------------------------

Global( "RC", {
		wt = {},	--- Таблица виджетов
		Config = {},	--- Таблица параметров
		var = {}	--- Таблица переменных
	      })

---------------------------------------------------------------------------------
-- EVENT HANDLERS
---------------------------------------------------------------------------------

-- EVENT_AVATAR_CREATED - возникает при появлении персонажа
function OnEventAvatarCreated( params )

	LocalizationInit()

	if GetGameLocalization() ~= "rus" then
		local CrystalEditableG = common.GetAddonRelatedTexture( "CrystalEditableG" )
		RC.wt.ConfigPanelFrame:GetChildChecked( "PriseOf1CrystalCrumb" , false ):SetBackgroundTexture( CrystalEditableG )
	end

	RC.wt.ConfigPanel:GetChildChecked( "ConfigTitle" , false ):SetVal( "value", ToWS( L[ "Settings" ] ) )
	RC.wt.ConfigPanelFrame:GetChildChecked( "BtnConfigApply", false ):SetVal( "button_label", ToWS( L[ "Apply" ] ) )
	RC.wt.ConfigPanelFrame:GetChildChecked( "PriseOf1CrystalText" , false ):SetVal( "value", ToWS( L[ "gPotato Exchange Rate" ] ) )
	RC.wt.ConfigPanelFrame:GetChildChecked( "PriseOf1kGoldenDustText" , false ):SetVal( "value", ToWS( L[ "Price of 1000 Gold Dust" ] ) )
	RC.wt.ConfigPanelFrame:GetChildChecked( "PriseOf1CrystalCrumbText" , false ):SetVal( "value", ToWS( L[ "Price of 1 Crystal Chip" ] ) )
	RC.wt.MainPanel:GetChildChecked( "BtnOpenConfig", false ):SetVal( "button_label", ToWS( L[ "Settings" ] ) )

	-- Регистрация событий системы
	common.RegisterEventHandler( OnEventSecondTimer, "EVENT_SECOND_TIMER" )
	common.RegisterEventHandler( OnEventEffectFinished, "EVENT_EFFECT_FINISHED" )
	common.RegisterEventHandler( OnEventInventoryItemChanged , "EVENT_INVENTORY_ITEM_CHANGED" ) 
end

-- EVENT_SECOND_TIMER - Каждую секунду проверяет на открытие окна создания рун
function OnEventSecondTimer( params )

	-- Окно было закрыто. Открылось
	if RC.wt.ContextRuneCombiner2:IsVisible() and not RC.wt.MainPanel:IsVisible() then
		StartTimer( 250 )
		RC.wt.MainPanel:Show( true )
	end
end

-- SCRIPT_TOGGLE_UI - При скрытии интерфейса (ALT+Z)
function OnToggleUI( params )
	mainForm:Show( params.visible )
end

-- U_EVENT_ADDON_MEM_USAGE_REQUEST - Запрос используемой памяти от "AddonManager"
function OnAMMemUsageRequest( params )
	userMods.SendEvent( "U_EVENT_ADDON_MEM_USAGE_RESPONSE", { sender = common.GetAddonName(), memUsage = gcinfo() } )
end

-- SCRIPT_ADDON_INFO_REQUEST - Запрос информации о аддоне от "AddonManager"
function OnAMAddonInfoRequest( params )
	if params.target == common.GetAddonName() then
		userMods.SendEvent( "SCRIPT_ADDON_INFO_RESPONSE", {
			sender = common.GetAddonName(),
			desc = L[ "RuneCalc Description" ],
		} )
	end
end

-- EVENT_INVENTORY_ITEM_CHANGED - Реакция на перемещение предмета в сумке
function OnEventInventoryItemChanged( params )
	local ItemId = avatar.GetInventoryItemId( params.slot )
	if ItemId then
		local itemInfo = avatar.GetItemInfo( ItemId )
		if itemInfo ~= nil then
			if itemInfo.runeInfo then
				RC.var.RuneId = ItemId
			end
		end
	end
end

-- Пользовательский таймер
function OnEventEffectFinished( params )

	-- Окно было открыто. Закрылось
	if not RC.wt.ContextRuneCombiner2:IsVisible() and RC.wt.MainPanel:IsVisible() then
		StopTimer()
		RC.wt.MainPanel:Show( false )
		RC.wt.ConfigPanel:Show( false )
	end
	
	-- Окно открыто. Вычисление значения полей
	if RC.wt.ContextRuneCombiner2:IsVisible() and RC.wt.MainPanel:IsVisible() then
		local count = RC.wt.Slider:GetPos()
		if RC.var.RuneId then

			local price = avatar.GetCombineRunesPrice( RC.var.RuneId, count - 7, 1 )

			local goldDust = price.goldDust * ( RC.Config.PriseOf1kGoldenDust / 1000 ) 
			MoneyToFormV( RC.wt.goldDust, ToMoney( goldDust ) )

			local crystalCrumb = price.crystalCrumb * ( RC.Config.PriseOf1CrystalCrumb * RC.Config.PriseOf1Crystal )
			MoneyToFormV( RC.wt.crystalCrumb, ToMoney( crystalCrumb ) )

			local totalPrice = goldDust + crystalCrumb
			MoneyToFormV( RC.wt.totalPrice, ToMoney( totalPrice ) )
		end
	end
end

-- Вызов параметров. Отрисовка окна конфигурации
function OnOpenConfig( params )
	MoneyToFormT( RC.wt.PriseOf1Crystal, ToMoney( RC.Config.PriseOf1Crystal ) )
	MoneyToFormT( RC.wt.PriseOf1kGoldenDust, ToMoney( RC.Config.PriseOf1kGoldenDust ) )
	RC.wt.PriseOf1CrystalCrumbC:SetText( ItoStr( RC.Config.PriseOf1CrystalCrumb ) )

	RC.wt.ConfigPanel:Show(true)
end

-- Принятие параметров
function OnConfigApply( params )
	RC.Config.PriseOf1Crystal = FromMoney( RC.wt.PriseOf1Crystal )
	RC.Config.PriseOf1kGoldenDust = FromMoney( RC.wt.PriseOf1kGoldenDust )
	RC.Config.PriseOf1CrystalCrumb = getInt( RC.wt.PriseOf1CrystalCrumbC:GetText() )
	userMods.SetGlobalConfigSection( "RuneCalc", RC.Config )

	RC.wt.ConfigPanel:Show(false)
end

-- Отмена параметров параметров
function OnConfigCancel( params )
	RC.wt.ConfigPanel:Show(false)
end

---------------------------------------------------------------------------------
-- INITIALIZATION
---------------------------------------------------------------------------------
function Init()

	local tConfig = userMods.GetGlobalConfigSection( "RuneCalc" )

	if tConfig then
		RC.Config = tConfig
	else
		RC.Config.PriseOf1kGoldenDust = 90000	--- Цена 1000 золотой пыли в медных монетах
		RC.Config.PriseOf1CrystalCrumb = 3	--- Цена 1 кристаллической крошки в кристаллах
		RC.Config.PriseOf1Crystal = 10000	--- Цена 1 кристалла в медных монетах
		userMods.SetGlobalConfigSection( "RuneCalc", RC.Config )
	end

	-- Подключение виджетов
	RC.wt.MainPanel = mainForm:GetChildChecked( "MainPanel" , false )
	RC.wt.goldDust = RC.wt.MainPanel:GetChildChecked( "goldDust" , false )
	RC.wt.crystalCrumb = RC.wt.MainPanel:GetChildChecked( "crystalCrumb" , false )
	RC.wt.totalPrice = RC.wt.MainPanel:GetChildChecked( "totalPrice" , false )

	RC.wt.ConfigPanel = mainForm:GetChildChecked( "ConfigPanel" , false )
	RC.wt.ConfigPanelFrame = RC.wt.ConfigPanel:GetChildChecked( "Frame" , false )

	RC.wt.PriseOf1Crystal = RC.wt.ConfigPanelFrame:GetChildChecked( "PriseOf1Crystal" , false )
	RC.wt.PriseOf1kGoldenDust = RC.wt.ConfigPanelFrame:GetChildChecked( "PriseOf1kGoldenDust" , false )
	RC.wt.PriseOf1CrystalCrumbC = RC.wt.ConfigPanelFrame:GetChildChecked( "PriseOf1CrystalCrumb" , false ):GetChildChecked( "Crystal" , false )

	RC.wt.ContextRuneCombiner2 = stateMainForm:GetChildChecked("Chamber", true ):GetParent()
	RC.wt.Slider = RC.wt.ContextRuneCombiner2:GetChildChecked("Chamber", false ):GetChildChecked("Slider", false )

	-- Регистрация событий системы
	common.RegisterEventHandler( OnEventAvatarCreated , "EVENT_AVATAR_CREATED" ) 

	-- Скрывать по "ALT+Z"
	common.RegisterEventHandler( OnToggleUI, "SCRIPT_TOGGLE_UI" )

	-- События "AddonManager"
	common.RegisterEventHandler( OnAMMemUsageRequest, "U_EVENT_ADDON_MEM_USAGE_REQUEST" )
	common.RegisterEventHandler( OnAMAddonInfoRequest, "SCRIPT_ADDON_INFO_REQUEST" )

	----  реакция на клавишу
	common.RegisterReactionHandler( OnOpenConfig, "OpenConfig" ) 
	common.RegisterReactionHandler( OnConfigApply, "ConfigApply" ) 
	common.RegisterReactionHandler( OnConfigCancel, "ConfigCancel" ) 

	----  Проверка на запуск из AddonManager
	if avatar.IsExist() then
		OnEventAvatarCreated()
	end
end
---------------------------------------------------------------------------------
Init()
---------------------------------------------------------------------------------
