Quantcast
-- ================================================================================ --
--				EMA - ( Ebony's MultiBoxing Assistant )    							--
--				Current Author: Jennifer Cally (Ebony)								--
--																					--
--				License: All Rights Reserved 2018-2020 Jennifer Cally					--
--																					--
--				Some Code Used from "Jamba" that is 								--
--				Released under the MIT License 										--
--				"Jamba" Copyright 2008-2015  Michael "Jafula" Miller				--
--																					--
-- ================================================================================ --
-- Create the addon using AceAddon-3.0 and embed some libraries.

local EMA = LibStub( "AceAddon-3.0" ):NewAddon(
	"Trade",
	"Module-1.0",
	"AceConsole-3.0",
	"AceEvent-3.0",
	"AceHook-3.0",
	"AceTimer-3.0"
)

-- Get the EMA Utilities Library.
local EMAUtilities = LibStub:GetLibrary( "EbonyUtilities-1.0" )
local EMAHelperSettings = LibStub:GetLibrary( "EMAHelperSettings-1.0" )
local LibBagUtils = LibStub:GetLibrary( "LibBagUtils-1.0" )
local AceGUI = LibStub( "AceGUI-3.0" )

--  Constants and Locale for this module.
EMA.moduleName = "Trade"
EMA.settingsDatabaseName = "TradeProfileDB"
EMA.chatCommand = "ema-trade"

local L = LibStub( "AceLocale-3.0" ):GetLocale( "Core" )
EMA.parentDisplayName = L["INTERACTION"]
EMA.moduleDisplayName = L["TRADE"]
-- Icon
EMA.moduleIcon = "Interface\\Addons\\EMA\\Media\\TradeIcon.tga"
-- order
EMA.moduleOrder = 10

-- Settings - the values to store and their defaults for the settings database.
EMA.settings = {
	 global = {
		['**'] = {
			autoTradeItemsListGlobal = {},
		},
	 },
	profile = {
		messageArea = EMAApi.DefaultMessageArea(),
		showEMATradeWindow = false,
		globalTadeList = false,
		blackListItem = false,
		tradeBoEItems = false,
		tradeCRItems = false,
		tradeRecipeFItems = false,
		autoSellOtherItemTag = EMAApi.MasterGroup(),
		autoBoEItemTag = EMAApi.MasterGroup(),
		autoCRItemTag = EMAApi.MasterGroup(),
		autoRecipeFItemTag = EMAApi.MasterGroup(),
		autoTradeItemsList = {},
		adjustMoneyWithMasterOnTrade = false,
		goldAmountToKeepOnToonTrade = 200,
	},
}

-- Configuration.
function EMA:GetConfiguration()
	local configuration = {
		name = EMA.moduleDisplayName,
		handler = EMA,
		type = 'group',
		childGroups  = "tab",
		get = "EMAConfigurationGetSetting",
		set = "EMAConfigurationSetSetting",
		args = {
			config = {
				type = "input",
				name = L["OPEN_CONFIG"],
				desc = L["OPEN_CONFIG_HELP"],
				usage = "/ema-team config",
				get = false,
				set = "",
			},
			push = {
				type = "input",
				name = L["PUSH_SETTINGS"],
				desc = L["PUSH_ALL_SETTINGS"],
				usage = "/ema-trade push",
				get = false,
				set = "EMASendSettings",
				guiHidden = true,
			},
			copy = {
				type = "input",
				name = L["COPY"],
				desc = L["COPY_HELP"],
				usage = "/ema-trade copy",
				get = false,
				set = "CopyListCommmand",
			},
		},
	}
	return configuration
end

-------------------------------------------------------------------------------------------------------------
-- Command this module sends.
-------------------------------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------------------------------
-- Messages module sends.
-------------------------------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------------------------------
-- Popup Dialogs.
-------------------------------------------------------------------------------------------------------------

local function InitializePopupDialogs()
	StaticPopupDialogs["EMATRADE_CONFIRM_REMOVE_TRADE_ITEMS"] = {
        text = L["REMOVE_TRADE_LIST"],
        button1 = YES,
        button2 = NO,
        timeout = 0,
		whileDead = 1,
		hideOnEscape = 1,
        OnAccept = function()
			EMA:RemoveItem()
		end,
    }
end


-------------------------------------------------------------------------------------------------------------
-- Addon initialization, enabling and disabling.
-------------------------------------------------------------------------------------------------------------

-- Initialise the module.
function EMA:OnInitialize()
	-- Initialise the popup dialogs.
	InitializePopupDialogs()
	EMA.autoTradeItemLink = nil
	--EMA.autoSellOtherItemTag = EMAApi.MasterGroup ()
	--EMA.autoTradeItemTag = EMAApi.MasterGroup ()
	-- Create the settings control.
	EMA:SettingsCreate()
	-- Initialse the EMAModule part of this module.
	EMA:EMAModuleInitialize( EMA.settingsControl.widgetSettings.frame )
	-- Populate the settings.
	EMA:SettingsRefresh()
end

-- Called when the addon is enabled.
function EMA:OnEnable()
	EMA:RegisterEvent( "TRADE_SHOW" )
	EMA:RegisterEvent( "TRADE_CLOSED" ) -- Unsued but we keep it for now!
	EMA:RawHook( "ContainerFrameItemButton_OnModifiedClick", true)
	EMA:RegisterMessage( EMAApi.MESSAGE_MESSAGE_AREAS_CHANGED, "OnMessageAreasChanged" )
	EMA:RegisterMessage( EMAApi.GROUP_LIST_CHANGED , "OnGroupAreasChanged" )
end

-- Called when the addon is disabled.
function EMA:OnDisable()
	-- AceHook-3.0 will tidy up the hooks for us.
end

function EMA:SettingsCreate()
	EMA.settingsControl = {}
	-- Create the settings panel.
	EMAHelperSettings:CreateSettings(
		EMA.settingsControl,
		EMA.moduleDisplayName,
		EMA.parentDisplayName,
		EMA.SettingsPushSettingsClick,
		EMA.moduleIcon,
		EMA.moduleOrder
	)
	local bottomOfInfo = EMA:SettingsCreateTrade( EMAHelperSettings:TopOfSettings() )
	EMA.settingsControl.widgetSettings.content:SetHeight( -bottomOfInfo )
	-- Help
	local helpTable = {}
	EMAHelperSettings:CreateHelp( EMA.settingsControl, helpTable, EMA:GetConfiguration() )
end

function EMA:SettingsPushSettingsClick( event )
	EMA:EMASendSettings()
end

function EMA:SettingsCreateTrade( top )
	local buttonControlWidth = 85
	local checkBoxHeight = EMAHelperSettings:GetCheckBoxHeight()
	local editBoxHeight = EMAHelperSettings:GetEditBoxHeight()
	local buttonHeight = EMAHelperSettings:GetButtonHeight()
	local dropdownHeight = EMAHelperSettings:GetDropdownHeight()
	local left = EMAHelperSettings:LeftOfSettings()
	local headingHeight = EMAHelperSettings:HeadingHeight()
	local headingWidth = EMAHelperSettings:HeadingWidth( false )
	local horizontalSpacing = EMAHelperSettings:GetHorizontalSpacing()
	local indentContinueLabel = horizontalSpacing * 18
	local verticalSpacing = EMAHelperSettings:GetVerticalSpacing()
	local tradeWidth = headingWidth
	local dropBoxWidth = (headingWidth - horizontalSpacing) / 4

	local halfWidth = (headingWidth - horizontalSpacing) / 2
	local thirdWidth = (headingWidth - indentContinueLabel) / 3
	local left2 = left + thirdWidth +  horizontalSpacing
	local left3 = left2 + thirdWidth +  horizontalSpacing
	local movingTop = top
	local movingTopEdit = - 10
	-- A blank to get layout to show right?
	EMAHelperSettings:CreateHeading( EMA.settingsControl, L[""], movingTop, false )
	movingTop = movingTop - headingHeight
	EMAHelperSettings:CreateHeading( EMA.settingsControl, L["TRADE_LIST_HEADER"], movingTop, false )
	movingTop = movingTop - headingHeight
	EMA.settingsControl.checkBoxShowEMATradeWindow = EMAHelperSettings:CreateCheckBox(
		EMA.settingsControl,
		halfWidth,
		left, --+ 130,
		movingTop,
		L["TRADE_LIST"],
		EMA.SettingsToggleShowEMATradeWindow,
		L["TRADE_LIST_HELP"]
	)
	EMA.settingsControl.checkBoxGlobalTradeList = EMAHelperSettings:CreateCheckBox(
		EMA.settingsControl,
		halfWidth,
		left3,
		movingTop,
		L["GLOBAL_LIST"],
		EMA.SettingsToggleGlobalTradeList,
		L["GLOBAL_SETTINGS_LIST_HELP"]
	)
	movingTop = movingTop - checkBoxHeight
	EMA.settingsControl.tradeItemsHighlightRow = 1
	EMA.settingsControl.tradeItemsOffset = 1
	local list = {}
	list.listFrameName = "EMATradeIteamsSettingsFrame"
	list.parentFrame = EMA.settingsControl.widgetSettings.content
	list.listTop = movingTop
	list.listLeft = left
	list.listWidth = tradeWidth
	list.rowHeight = 15
	list.rowsToDisplay = 10
	list.columnsToDisplay = 3
	list.columnInformation = {}
	list.columnInformation[1] = {}
	list.columnInformation[1].width = 40
	list.columnInformation[1].alignment = "LEFT"
	list.columnInformation[2] = {}
	list.columnInformation[2].width = 20
	list.columnInformation[2].alignment = "LEFT"
	list.columnInformation[3] = {}
	list.columnInformation[3].width = 20
	list.columnInformation[3].alignment = "LEFT"
	list.scrollRefreshCallback = EMA.SettingsScrollRefresh
	list.rowClickCallback = EMA.SettingsTradeItemsRowClick
	EMA.settingsControl.tradeItems = list
	EMAHelperSettings:CreateScrollList( EMA.settingsControl.tradeItems )
	movingTop = movingTop - list.listHeight - verticalSpacing
	EMA.settingsControl.tradeItemsButtonRemove = EMAHelperSettings:CreateButton(
		EMA.settingsControl,
		buttonControlWidth,
		left2 + 50,
		movingTop,
		L["REMOVE"],
		EMA.SettingsTradeItemsRemoveClick
	)
	movingTop = movingTop -	buttonHeight - verticalSpacing
	EMAHelperSettings:CreateHeading( EMA.settingsControl, L["ADD_ITEMS"], movingTop, false )
	movingTop = movingTop - headingHeight
	EMA.settingsControl.tradeItemsEditBoxTradeItem = EMAHelperSettings:CreateEditBox(
		EMA.settingsControl,
		thirdWidth,
		left2,
		movingTop,
		L["ITEM_DROP"]
	)
	EMA.settingsControl.tradeItemsEditBoxTradeItem:SetCallback( "OnEnterPressed", EMA.SettingsEditBoxChangedTradeItem )
	movingTop = movingTop - editBoxHeight
		EMA.settingsControl.listCheckBoxBoxOtherBlackListItem = EMAHelperSettings:CreateCheckBox(
		EMA.settingsControl,
		thirdWidth,
		left,
		movingTop + movingTopEdit,
		L["BLACKLIST_ITEM"],
		EMA.SettingsToggleBlackListItem,
		L["BLACKLIST_ITEM_HELP"]
	)
	EMA.settingsControl.tradeItemsEditBoxToonTag = EMAHelperSettings:CreateDropdown(
		EMA.settingsControl,
		thirdWidth,
		left3 ,
		movingTop,
		L["GROUP_LIST"]
	)
	EMA.settingsControl.tradeItemsEditBoxToonTag:SetList( EMAApi.GroupList() )
	EMA.settingsControl.tradeItemsEditBoxToonTag:SetCallback( "OnValueChanged",  EMA.TradeGroupListDropDownList )
	movingTop = movingTop - editBoxHeight
	EMA.settingsControl.tradeItemsButtonAdd = EMAHelperSettings:CreateButton(
		EMA.settingsControl,
		buttonControlWidth,
		left2 + 50,
		movingTop,
		L["ADD"],
		EMA.SettingsTradeItemsAddClick
	)
	movingTop = movingTop -	buttonHeight
	EMAHelperSettings:CreateHeading( EMA.settingsControl, L["TRADE_OPTIONS"], movingTop, false )
	movingTop = movingTop - headingHeight
	EMA.settingsControl.checkBoxTradeBoEItems = EMAHelperSettings:CreateCheckBox(
	EMA.settingsControl,
		halfWidth,
		left,
		movingTop + movingTopEdit,
		L["TRADE_BOE_ITEMS"],
		EMA.SettingsToggleTradeBoEItems,
		L["TRADE_BOE_ITEMS_HELP"]
	)
	EMA.settingsControl.tradeTradeBoEItemsTag = EMAHelperSettings:CreateDropdown(
		EMA.settingsControl,
		dropBoxWidth,
		left3,
		movingTop,
		L["GROUP_LIST"]
	)
	EMA.settingsControl.tradeTradeBoEItemsTag:SetList( EMAApi.GroupList() )
	EMA.settingsControl.tradeTradeBoEItemsTag:SetCallback( "OnValueChanged",  EMA.TradeGroupListItemsBoEDropDown )
	movingTop = movingTop - editBoxHeight - 3
	EMA.settingsControl.checkBoxTradeCRItems = EMAHelperSettings:CreateCheckBox(
	EMA.settingsControl,
		halfWidth,
		left,
		movingTop + movingTopEdit,
		L["TRADE_REAGENTS"],
		EMA.SettingsToggleTradeCRItems,
		L["TRADE_REAGENTS_HELP"]
	)
	EMA.settingsControl.tradeTradeCRItemsTag = EMAHelperSettings:CreateDropdown(
		EMA.settingsControl,
		dropBoxWidth,
		left3,
		movingTop,
		L["GROUP_LIST"]
	)
	EMA.settingsControl.tradeTradeCRItemsTag:SetList( EMAApi.GroupList() )
	EMA.settingsControl.tradeTradeCRItemsTag:SetCallback( "OnValueChanged",  EMA.TradeGroupListItemsCRDropDown )
	-- NEW AKANDESH THING
	movingTop = movingTop - editBoxHeight - 3
	EMA.settingsControl.checkBoxTradeRecipeFItems = EMAHelperSettings:CreateCheckBox(
	EMA.settingsControl,
		halfWidth,
		left,
		movingTop + movingTopEdit,
		L["TRADE_RECIPE_FORMULA"],
		EMA.SettingsToggleTradeRecipeFItems,
		L["TRADE_RECIPE_FORMULA_HELP"]
	)
	EMA.settingsControl.tradeTradeRecipeFItemsTag = EMAHelperSettings:CreateDropdown(
		EMA.settingsControl,
		dropBoxWidth,
		left3,
		movingTop,
		L["GROUP_LIST"]
	)
	EMA.settingsControl.tradeTradeRecipeFItemsTag:SetList( EMAApi.GroupList() )
	EMA.settingsControl.tradeTradeRecipeFItemsTag:SetCallback( "OnValueChanged",  EMA.TradeGroupListItemsRecipeFDropDown )
	-- Trade Gold! Keep
	movingTop = movingTop - editBoxHeight
	EMA.settingsControl.checkBoxAdjustMoneyWithMasterOnTrade = EMAHelperSettings:CreateCheckBox(
		EMA.settingsControl,
		headingWidth,
		left + 150,
		movingTop,
		L["TRADE_GOLD"],
		EMA.SettingsToggleAdjustMoneyWithMasterOnTrade,
		L["TRADE_GOLD_HELP"]
	)
	movingTop = movingTop - checkBoxHeight
	EMA.settingsControl.editBoxGoldAmountToLeaveOnToonTrade = EMAHelperSettings:CreateEditBox( EMA.settingsControl,
		dropBoxWidth,
		left2,
		movingTop,
		L["GOLD_TO_KEEP"]
	)
	EMA.settingsControl.editBoxGoldAmountToLeaveOnToonTrade:SetCallback( "OnEnterPressed", EMA.EditBoxChangedGoldAmountToLeaveOnToonTrade )
	movingTop = movingTop - editBoxHeight
	EMA.settingsControl.dropdownMessageArea = EMAHelperSettings:CreateDropdown(
		EMA.settingsControl,
		dropBoxWidth,
		left2,
		movingTop,
		L["MESSAGE_AREA"]
	)
	EMA.settingsControl.dropdownMessageArea:SetList( EMAApi.MessageAreaList() )
	EMA.settingsControl.dropdownMessageArea:SetCallback( "OnValueChanged", EMA.SettingsSetMessageArea )
	movingTop = movingTop - dropdownHeight - verticalSpacing
	return movingTop
end


-------------------------------------------------------------------------------------------------------------
-- Settings Callbacks.
-------------------------------------------------------------------------------------------------------------


function EMA:SettingsScrollRefresh()
	FauxScrollFrame_Update(
		EMA.settingsControl.tradeItems.listScrollFrame,
		EMA:GetTradeItemsMaxPosition(),
		EMA.settingsControl.tradeItems.rowsToDisplay,
		EMA.settingsControl.tradeItems.rowHeight
	)
	EMA.settingsControl.tradeItemsOffset = FauxScrollFrame_GetOffset( EMA.settingsControl.tradeItems.listScrollFrame )
	for iterateDisplayRows = 1, EMA.settingsControl.tradeItems.rowsToDisplay do
		-- Reset.
		EMA.settingsControl.tradeItems.rows[iterateDisplayRows].columns[1].textString:SetText( "" )
		EMA.settingsControl.tradeItems.rows[iterateDisplayRows].columns[1].textString:SetTextColor( 1.0, 1.0, 1.0, 1.0 )
		EMA.settingsControl.tradeItems.rows[iterateDisplayRows].columns[2].textString:SetText( "" )
		EMA.settingsControl.tradeItems.rows[iterateDisplayRows].columns[2].textString:SetTextColor( 1.0, 1.0, 1.0, 1.0 )
		EMA.settingsControl.tradeItems.rows[iterateDisplayRows].columns[3].textString:SetText( "" )
		EMA.settingsControl.tradeItems.rows[iterateDisplayRows].columns[3].textString:SetTextColor( 1.0, 0, 00, 1.0 )
		EMA.settingsControl.tradeItems.rows[iterateDisplayRows].highlight:SetColorTexture( 0.0, 0.0, 0.0, 0.0 )
		-- Get data.
		local dataRowNumber = iterateDisplayRows + EMA.settingsControl.tradeItemsOffset
		if dataRowNumber <= EMA:GetTradeItemsMaxPosition() then
			-- Put data information into columns.
			local tradeItemsInformation = EMA:GetTradeItemsAtPosition( dataRowNumber )
			local blackListText = ""
			if tradeItemsInformation.blackList == true then
				blackListText = L["ITEM_ON_BLACKLIST"]
			end
			EMA.settingsControl.tradeItems.rows[iterateDisplayRows].columns[1].textString:SetText( tradeItemsInformation.name )
			EMA.settingsControl.tradeItems.rows[iterateDisplayRows].columns[2].textString:SetText( tradeItemsInformation.tag )
			EMA.settingsControl.tradeItems.rows[iterateDisplayRows].columns[3].textString:SetText( blackListText )
			-- Highlight the selected row.
			if dataRowNumber == EMA.settingsControl.tradeItemsHighlightRow then
				EMA.settingsControl.tradeItems.rows[iterateDisplayRows].highlight:SetColorTexture( 1.0, 1.0, 0.0, 0.5 )
			end
		end
	end
end

function EMA:SettingsTradeItemsRowClick( rowNumber, columnNumber )
	if EMA.settingsControl.tradeItemsOffset + rowNumber <= EMA:GetTradeItemsMaxPosition() then
		EMA.settingsControl.tradeItemsHighlightRow = EMA.settingsControl.tradeItemsOffset + rowNumber
		EMA:SettingsScrollRefresh()
	end
end

function EMA:SettingsTradeItemsRemoveClick( event )
	StaticPopup_Show( "EMATRADE_CONFIRM_REMOVE_TRADE_ITEMS" )
end

function EMA:SettingsEditBoxChangedTradeItem( event, text )
	EMA.autoTradeItemLink = text
	EMA:SettingsRefresh()
end

function EMA:TradeGroupListDropDownList (event, value )
	-- if nil or the blank group then don't get Name.
	if value == " " or value == nil then
		return
	end
	for index, groupName in ipairs( EMAApi.GroupList() ) do
		if index == value then
			EMA.db.autoSellOtherItemTag = groupName
			break
		end
	end
	EMA:SettingsRefresh()
end

function EMA:SettingsToggleBlackListItem( event, checked )
	EMA.db.blackListItem = checked
	EMA:SettingsRefresh()
end

function EMA:SettingsTradeItemsAddClick( event )
	if EMA.autoTradeItemLink ~= nil and EMA.db.autoSellOtherItemTag ~= nil then
		--EMA:Print("test",  EMA.db.blackListItem )
		EMA:AddItem( EMA.autoTradeItemLink, EMA.db.autoSellOtherItemTag, EMA.db.blackListItem )
		EMA.autoTradeItemLink = nil
		EMA.settingsControl.tradeItemsEditBoxTradeItem:SetText( "" )
		EMA:SettingsRefresh()
	end
end

function EMA:OnMessageAreasChanged( message )
	EMA.settingsControl.dropdownMessageArea:SetList( EMAApi.MessageAreaList() )
end

function EMA:OnGroupAreasChanged( message )
	EMA.settingsControl.tradeItemsEditBoxToonTag:SetList( EMAApi.GroupList() )
	EMA.settingsControl.tradeTradeCRItemsTag:SetList( EMAApi.GroupList() )
	EMA.settingsControl.tradeTradeRecipeFItemsTag:SetList( EMAApi.GroupList() )
	EMA.settingsControl.tradeTradeBoEItemsTag:SetList( EMAApi.GroupList() )
end

function EMA:SettingsSetMessageArea( event, value )
	EMA.db.messageArea = value
	EMA:SettingsRefresh()
end

function EMA:SettingsToggleGlobalTradeList( event, checked )
	EMA.db.globalTradeList = checked
	EMA:SettingsRefresh()
end

function EMA:SettingsToggleShowEMATradeWindow( event, checked )
	EMA.db.showEMATradeWindow = checked
	EMA:SettingsRefresh()
end

function EMA:SettingsToggleTradeBoEItems(event, checked )
	EMA.db.tradeBoEItems = checked
	EMA:SettingsRefresh()
end

function EMA:TradeGroupListItemsBoEDropDown(event, value )
	if value == " " or value == nil then
		return
	end
	for index, groupName in ipairs( EMAApi.GroupList() ) do
		if index == value then
			EMA.db.autoBoEItemTag = groupName
			break
		end
	end
	EMA:SettingsRefresh()
end

function EMA:SettingsToggleTradeCRItems(event, checked )
	EMA.db.tradeCRItems = checked
	EMA:SettingsRefresh()
end

function EMA:SettingsToggleTradeRecipeFItems(event, checked )
	EMA.db.tradeRecipeFItems = checked
	EMA:SettingsRefresh()
end

function EMA:TradeGroupListItemsCRDropDown(event, value )
	if value == " " or value == nil then
		return
	end
	for index, groupName in ipairs( EMAApi.GroupList() ) do
		if index == value then
			EMA.db.autoCRItemTag = groupName
			break
		end
	end
	EMA:SettingsRefresh()
end

function EMA:TradeGroupListItemsRecipeFDropDown(event, value )
	if value == " " or value == nil then
		return
	end
	for index, groupName in ipairs( EMAApi.GroupList() ) do
		if index == value then
			EMA.db.autoRecipeFItemTag = groupName
			break
		end
	end
	EMA:SettingsRefresh()
end


function EMA:SettingsToggleAdjustMoneyOnToonViaGuildBank( event, checked )
	EMA.db.adjustMoneyWithGuildBank = checked
	EMA:SettingsRefresh()
end

function EMA:SettingsToggleAdjustMoneyWithMasterOnTrade( event, checked )
	EMA.db.adjustMoneyWithMasterOnTrade = checked
	EMA:SettingsRefresh()
end

function EMA:EditBoxChangedGoldAmountToLeaveOnToon( event, text )
	EMA.db.goldAmountToKeepOnToon = tonumber( text )
	if EMA.db.goldAmountToKeepOnToon == nil then
		EMA.db.goldAmountToKeepOnToon = 0
	end
	EMA:SettingsRefresh()
end

function EMA:EditBoxChangedGoldAmountToLeaveOnToonTrade( event, text )
	EMA.db.goldAmountToKeepOnToonTrade = tonumber( text )
	if EMA.db.goldAmountToKeepOnToonTrade == nil then
		EMA.db.goldAmountToKeepOnToonTrade = 0
	end
	EMA:SettingsRefresh()
end

function EMA:CopyListCommmand()
	EMA:Print("Copying Local List To Global List")
	EMA.db.global.autoTradeItemsListGlobal = EMAUtilities:CopyTable( EMA.db.autoTradeItemsList )
	EMA:SettingsRefresh()
end

-- Settings received.
function EMA:EMAOnSettingsReceived( characterName, settings )
	if characterName ~= EMA.characterName then
		-- Update the settings.
		EMA.db.messageArea = settings.messageArea
		EMA.db.showEMATradeWindow = settings.showEMATradeWindow
		EMA.db.globalTradeList = settings.globalTradeList
		EMA.db.autoSellOtherItemTag = settings.autoSellOtherItemTag
		EMA.db.blackListItem = settings.blackListItem
		EMA.db.tradeBoEItems = settings.tradeBoEItems
		EMA.db.tradeCRItems = settings.tradeCRItems
		EMA.db.tradeRecipeFItems = settings.tradeRecipeFItems
		EMA.db.autoBoEItemTag = settings.autoBoEItemTag
		EMA.db.autoCRItemTag = settings.autoCRItemTag
		EMA.db.autoTradeItemsList = EMAUtilities:CopyTable( settings.autoTradeItemsList )
		EMA.db.global.autoTradeItemsListGlobal = EMAUtilities:CopyTable( settings.global.autoTradeItemsListGlobal )
		EMA.db.adjustMoneyWithGuildBank = settings.adjustMoneyWithGuildBank
		EMA.db.goldAmountToKeepOnToon = settings.goldAmountToKeepOnToon
		EMA.db.adjustMoneyWithMasterOnTrade = settings.adjustMoneyWithMasterOnTrade
		EMA.db.goldAmountToKeepOnToonTrade = settings.goldAmountToKeepOnToonTrade
		-- Refresh the settings.
		EMA:SettingsRefresh()
		-- Tell the player.
		EMA:Print( L["SETTINGS_RECEIVED_FROM_A"]( characterName ) )
	end
end

function EMA:BeforeEMAProfileChanged()
end

function EMA:OnEMAProfileChanged()
	EMA:SettingsRefresh()
end

function EMA:SettingsRefresh()
	EMA.settingsControl.checkBoxShowEMATradeWindow:SetValue( EMA.db.showEMATradeWindow )
	-- global CheckBox
	EMA.settingsControl.checkBoxGlobalTradeList:SetValue( EMA.db.globalTradeList )
	EMA.settingsControl.checkBoxGlobalTradeList:SetDisabled( not EMA.db.showEMATradeWindow )
	EMA.settingsControl.listCheckBoxBoxOtherBlackListItem:SetValue( EMA.db.blackListItem )
	EMA.settingsControl.checkBoxTradeBoEItems:SetValue( EMA.db.tradeBoEItems)
	EMA.settingsControl.checkBoxTradeCRItems:SetValue( EMA.db.tradeCRItems)
	EMA.settingsControl.checkBoxTradeRecipeFItems:SetValue( EMA.db.tradeRecipeFItems)
	EMA.settingsControl.dropdownMessageArea:SetValue( EMA.db.messageArea )
	EMA.settingsControl.tradeItemsEditBoxToonTag:SetText( EMA.db.autoSellOtherItemTag )
	EMA.settingsControl.tradeTradeBoEItemsTag:SetText( EMA.db.autoBoEItemTag )
	EMA.settingsControl.tradeTradeCRItemsTag:SetText( EMA.db.autoCRItemTag )
	EMA.settingsControl.tradeTradeRecipeFItemsTag:SetText( EMA.db.autoRecipeFItemTag )
	EMA.settingsControl.checkBoxAdjustMoneyWithMasterOnTrade:SetValue( EMA.db.adjustMoneyWithMasterOnTrade )
	EMA.settingsControl.editBoxGoldAmountToLeaveOnToonTrade:SetText( tostring( EMA.db.goldAmountToKeepOnToonTrade ) )
	EMA.settingsControl.editBoxGoldAmountToLeaveOnToonTrade:SetDisabled( not EMA.db.adjustMoneyWithMasterOnTrade )
	EMA.settingsControl.tradeItemsEditBoxTradeItem:SetDisabled( not EMA.db.showEMATradeWindow )
	EMA.settingsControl.tradeItemsEditBoxToonTag:SetDisabled( not EMA.db.showEMATradeWindow )
	EMA.settingsControl.tradeItemsButtonRemove:SetDisabled( not EMA.db.showEMATradeWindow )
	EMA.settingsControl.tradeItemsButtonAdd:SetDisabled( not EMA.db.showEMATradeWindow )
	EMA.settingsControl.listCheckBoxBoxOtherBlackListItem:SetDisabled( not EMA.db.showEMATradeWindow )
	EMA.settingsControl.checkBoxTradeBoEItems:SetDisabled( not EMA.db.showEMATradeWindow )
	EMA.settingsControl.tradeTradeBoEItemsTag:SetDisabled( not EMA.db.showEMATradeWindow )
	EMA.settingsControl.checkBoxTradeCRItems:SetDisabled( not EMA.db.showEMATradeWindow )
	EMA.settingsControl.tradeTradeCRItemsTag:SetDisabled( not EMA.db.showEMATradeWindow )
	EMA.settingsControl.checkBoxTradeRecipeFItems:SetDisabled( not EMA.db.showEMATradeWindow )
	EMA.settingsControl.tradeTradeRecipeFItemsTag:SetDisabled( not EMA.db.showEMATradeWindow )
	EMA:SettingsScrollRefresh()
end

--Comms not sure if we going to use comms here.
-- A EMA command has been received.
function EMA:EMAOnCommandReceived( characterName, commandName, ... )
	if characterName == self.characterName then
		return
	end
end

-------------------------------------------------------------------------------------------------------------
-- Trade functionality.
-------------------------------------------------------------------------------------------------------------

function EMA:ContainerFrameItemButton_OnModifiedClick( self, event, ... )
	local isConfigOpen = EMAPrivate.SettingsFrame.Widget:IsVisible()
	if isConfigOpen == true and IsShiftKeyDown() == true then
		local GUIPanel = EMAPrivate.SettingsFrame.TreeGroupStatus.selected
		local currentModule = string.find(GUIPanel, EMA.moduleDisplayName)
		--EMA:Print("test2", GUIPanel, "vs", currentModule )
		if currentModule ~= nil then
			local itemID, itemLink = GameTooltip:GetItem()
			--EMA:Print("test1", itemID, itemLink )
			if itemLink ~= nil then
				EMA.settingsControl.tradeItemsEditBoxTradeItem:SetText( "" )
				EMA.settingsControl.tradeItemsEditBoxTradeItem:SetText( itemLink )
				EMA.autoTradeItemLink = itemLink
				return
			end
		end
	end
	return EMA.hooks["ContainerFrameItemButton_OnModifiedClick"]( self, event, ... )
end


-- New Trade stuff
function EMA:GetTradeItemsMaxPosition()
	if EMA.db.globalTradeList == true then
		return #EMA.db.global.autoTradeItemsListGlobal
	else
		return #EMA.db.autoTradeItemsList
	end
end

function EMA:GetTradeItemsAtPosition( position )
	if EMA.db.globalTradeList == true then
		return EMA.db.global.autoTradeItemsListGlobal[position]
	else
		return EMA.db.autoTradeItemsList[position]
	end
end

function EMA:AddItem( itemLink, itemTag, blackList )
	-- Get some more information about the item.
	--EMA:Print("test", itemLink, itemTag, blackList )
	local name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo( itemLink )
	-- If the item could be found.
	if name ~= nil then
		local itemInformation = {}
		itemInformation.link = link
		itemInformation.name = name
		itemInformation.tag = itemTag
		itemInformation.blackList = blackList
		if EMA.db.globalTradeList == true then
			table.insert( EMA.db.global.autoTradeItemsListGlobal, itemInformation )
		else
			table.insert( EMA.db.autoTradeItemsList, itemInformation )
		end
		EMA:SettingsRefresh()
		EMA:SettingsTradeItemsRowClick( 1 , 1 )
	end
end

function EMA:RemoveItem()
	if EMA.db.globalTradeList == true then
		table.remove( EMA.db.global.autoTradeItemsListGlobal,  EMA.settingsControl.tradeItemsHighlightRow )
	else
		table.remove( EMA.db.autoTradeItemsList, EMA.settingsControl.tradeItemsHighlightRow )
	end
	EMA:SettingsRefresh()
	EMA:SettingsTradeItemsRowClick( EMA.settingsControl.tradeItemsHighlightRow -1 , 1 )
end

function EMA:TRADE_SHOW( event, ... )
	--Keep for tradeing gold!
	if EMA.db.adjustMoneyWithMasterOnTrade == true then
		if not IsShiftKeyDown() then
			EMA:ScheduleTimer( "TradeShowAdjustMoneyWithMaster", 0.3 )
		end
	end
	-- do trade list with Gold!
	if EMA.db.showEMATradeWindow == true then
		if not IsShiftKeyDown() then
			EMA:ScheduleTimer("TradeAllItems", 0.5 )
		end
	end
end

function EMA:TradeShowAdjustMoneyWithMaster()
	if EMAApi.IsCharacterTheMaster( EMA.characterName ) == true then
		return
	end
	local moneyToKeepOnToon = tonumber( EMA.db.goldAmountToKeepOnToonTrade ) * 10000
	local moneyOnToon = GetMoney()
	local moneyToDepositOrWithdraw = moneyOnToon - moneyToKeepOnToon
	if moneyToDepositOrWithdraw == 0 then
		return
	end
	if moneyToDepositOrWithdraw > 0 then
		local tradePlayersName = GetUnitName("NPC", true)
		local characterName = EMAUtilities:AddRealmToNameIfMissing( tradePlayersName )
		if EMAApi.IsCharacterTheMaster(characterName) == true and EMAUtilities:CheckIsFromMyRealm(characterName) == true then
			MoneyInputFrame_SetCopper(TradePlayerInputMoneyFrame, moneyToDepositOrWithdraw)
		end
	end
end

function EMA:TradeAllItems()
	local tradePlayersName = GetUnitName("NPC", true)
	local characterName = EMAUtilities:AddRealmToNameIfMissing( tradePlayersName )
	--EMA:Print("testTradeName", characterName)
	if EMAApi.IsCharacterInTeam ( characterName ) == false and EMAUtilities:CheckIsFromMyRealm(characterName) == false then
		return
	end
	for bagID = 0, NUM_BAG_SLOTS do
		for slotID = 1,GetContainerNumSlots( bagID ),1 do
			--EMA:Print( "Bags OK. checking", itemLink )
			local item = Item:CreateFromBagAndSlot(bagID, slotID)
			if ( item ) then
				local bagItemLink = item:GetItemLink()
				if ( bagItemLink ) then
					local itemLink = item:GetItemLink()
					local location = item:GetItemLocation()
					local inventoryType = C_Item.GetItemInventoryType( location )
					local isBop = C_Item.IsBound( location )
					local itemRarity =  C_Item.GetItemQuality( location )
					--itemName, itemLink, itemRarity, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount, itemEquipLoc, itemIcon, itemSellPrice, itemClassID, itemSubClassID, bindType, expacID, itemSetID, isCraftingReagent
					local itemClassID = select(12, GetItemInfo(bagItemLink) )
					local isCraftingReagent = select(17, GetItemInfo(bagItemLink) )
					local canTrade = false
					if EMA.db.tradeBoEItems == true then
						if inventoryType ~= 0 then
							if EMAApi.IsCharacterInGroup( characterName, EMA.db.autoBoEItemTag ) == true then
								if isBop == false then
									if itemRarity == 2 or itemRarity == 3 or itemRarity == 4 then
										canTrade = true
									end
								end
							end
						end
					end
					if EMA.db.tradeCRItems == true then
						if isCraftingReagent == true then
							if EMAApi.IsCharacterInGroup( characterName, EMA.db.autoCRItemTag ) == true then
								if isBop == false then
									canTrade = true
								end
							end
						end
					end
					if EMA.db.tradeRecipeFItems == true then
						if itemClassID == 9 then -- LE_ITEM_CLASS_RECIPE
							if EMAApi.IsCharacterInGroup( characterName, EMA.db.autoRecipeFItemTag ) == true then
								if isBop == false then
									canTrade = true
								end
							end
						end
					end
					if EMA.db.globalTradeList == true then
						itemTable = EMA.db.global.autoTradeItemsListGlobal
					else
						itemTable = EMA.db.autoTradeItemsList
					end
					for position, itemInformation in pairs( itemTable ) do
						if EMAApi.IsCharacterInGroup( characterName, itemInformation.tag ) == true then
							if EMAUtilities:DoItemLinksContainTheSameItem( itemLink, itemInformation.link ) then
								--EMA:Print("DataTest", itemInformation.link, itemInformation.blackList )
								--EMA:Print("test", itemLink)
								canTrade = true
								if itemInformation.blackList == true then
									canTrade = false
								end
							end
						end
					end
					if canTrade == true then
						for iterateTradeSlots = 1, ( MAX_TRADE_ITEMS - 1 ) do
							if GetTradePlayerItemLink( iterateTradeSlots ) == nil then
								PickupContainerItem( bagID, slotID )
								ClickTradeButton( iterateTradeSlots )
							end
						end
					end
				end
			end
		end
	end
end

function EMA:TRADE_CLOSED()

end