local AS = unpack(AddOnSkins)

-- Cache global variables
--Lua functions
local _G = _G
local pairs, select, unpack = pairs, select, unpack
--WoW API / Variables
local CreateFrame = CreateFrame
local hooksecurefunc = hooksecurefunc
-- GLOBALS:

function AS:Blizzard_AuctionHouseUI(event, addon)
	if addon ~= "Blizzard_AuctionHouseUI" then return end

	local function HandleAuctionButtons(button)
		AS:SkinButton(button)
		button:SetSize(22, 22)
	end

	local function HandleHeaders(frame)
		local maxHeaders = frame.HeaderContainer:GetNumChildren()
		for i = 1, maxHeaders do
			local header = select(i, frame.HeaderContainer:GetChildren())
			if header and not header.IsSkinned then
				header:DisableDrawLayer("BACKGROUND")
				if not header.backdrop then
					AS:CreateBackdrop(header)
				end

				header.IsSkinned = true
			end

			if header.Backdrop then
				header.Backdrop:SetPoint("BOTTOMRIGHT", i < maxHeaders and -5 or 0, -2)
			end
		end
	end

	local function HandleSummaryIcons(frame)
		for i = 1, 23 do
			local child = select(i, frame.ScrollFrame.scrollChild:GetChildren())

			if child and child.Icon then
				if not child.IsSkinned then
					AS:SkinTexture(child.Icon)

					if child.IconBorder then
						child.IconBorder:SetAlpha(0)
					end

					child.IsSkinned = true
				end
			end
		end
	end

	local function SkinItemDisplay(frame)
		local ItemDisplay = frame.ItemDisplay
		AS:StripTextures(ItemDisplay)

		local ItemButton = ItemDisplay.ItemButton
		ItemButton.CircleMask:Hide()

		-- We skin the new IconBorder from the AH, it looks really cool tbh.
		ItemButton.Icon:SetTexCoord(.08, .92, .08, .92)
		ItemButton.Icon:SetSize(44, 44)
		ItemButton.IconBorder:SetTexCoord(.08, .92, .08, .92)
	end

	local function HandleSellFrame(frame)
		AS:StripTextures(frame)

		local ItemDisplay = frame.ItemDisplay
		AS:StripTextures(ItemDisplay)

		local ItemButton = ItemDisplay.ItemButton
		if ItemButton.IconMask then ItemButton.IconMask:Hide() end
		if ItemButton.IconBorder then ItemButton.IconBorder:SetAlpha(0) end

		ItemButton.EmptyBackground:Hide()
		ItemButton:SetPushedTexture("")
		ItemButton.Highlight:SetColorTexture(1, 1, 1, .25)
		ItemButton.Highlight:SetAllPoints(ItemButton.Icon)

		AS:SkinTexture(ItemButton.Icon, true)
		hooksecurefunc(ItemButton.IconBorder, "SetVertexColor", function(_, r, g, b) ItemButton.Icon.Backdrop:SetBackdropBorderColor(r, g, b) end)
		hooksecurefunc(ItemButton.IconBorder, "Hide", function() ItemButton.Icon.Backdrop:SetBackdropBorderColor(0, 0, 0) end)

		AS:SkinEditBox(frame.QuantityInput.InputBox)
		AS:SkinButton(frame.QuantityInput.MaxButton)
		AS:SkinEditBox(frame.PriceInput.MoneyInputFrame.GoldBox)
		AS:SkinEditBox(frame.PriceInput.MoneyInputFrame.SilverBox)

		if frame.SecondaryPriceInput then
			AS:SkinEditBox(frame.SecondaryPriceInput.MoneyInputFrame.GoldBox)
			AS:SkinEditBox(frame.SecondaryPriceInput.MoneyInputFrame.SilverBox)
		end

		AS:SkinDropDownBox(frame.DurationDropDown.DropDown)
		AS:SkinButton(frame.PostButton)

		if frame.BuyoutModeCheckButton then
			AS:SkinCheckBox(frame.BuyoutModeCheckButton)
			frame.BuyoutModeCheckButton:SetSize(20, 20)
		end
	end

	local function HandleTokenSellFrame(frame)
		frame:StripTextures()

		local ItemDisplay = frame.ItemDisplay
		ItemDisplay:StripTextures()
		ItemDisplay:CreateBackdrop("Transparent")

		local ItemButton = ItemDisplay.ItemButton
		if ItemButton.IconMask then ItemButton.IconMask:Hide() end
		if ItemButton.IconBorder then ItemButton.IconBorder:SetAlpha(0) end

		ItemButton.EmptyBackground:Hide()
		ItemButton:SetPushedTexture("")
		ItemButton.Highlight:SetColorTexture(1, 1, 1, .25)
		ItemButton.Highlight:SetAllPoints(ItemButton.Icon)

		AS:SkinTexture(ItemButton.Icon, true)
		hooksecurefunc(ItemButton.IconBorder, "SetVertexColor", function(_, r, g, b) ItemButton.Icon.Backdrop:SetBackdropBorderColor(r, g, b) end)
		hooksecurefunc(ItemButton.IconBorder, "Hide", function() ItemButton.Icon.Backdrop:SetBackdropBorderColor(0, 0, 0) end)

		AS:SkinButton(frame.PostButton)
		HandleAuctionButtons(frame.DummyRefreshButton)

		AS:SkinBackdropFrame(frame.DummyItemList)
		HandleAuctionButtons(frame.DummyRefreshButton)
		AS:SkinScrollBar(frame.DummyItemList.DummyScrollBar)
	end

	local function HandleSellList(frame, hasHeader)
		AS:StripTextures(frame)

		if frame.RefreshFrame then
			HandleAuctionButtons(frame.RefreshFrame.RefreshButton)
		end

		AS:SkinScrollBar(frame.ScrollFrame.scrollBar)

		if hasHeader then
			AS:CreateBackdrop(frame.ScrollFrame)
			hooksecurefunc(frame, "RefreshScrollFrame", HandleHeaders)
		else
			hooksecurefunc(frame, "RefreshListDisplay", HandleSummaryIcons)
		end
	end

	AS:SkinBackdropFrame(_G.AuctionHouseFrame, nil, nil, true)
	AS:CreateShadow(_G.AuctionHouseFrame.Backdrop)

	AS:SkinCloseButton(_G.AuctionHouseFrameCloseButton)

	for _, tab in ipairs(_G.AuctionHouseFrame.Tabs) do
		AS:SkinTab(tab)
	end

	AS:StripTextures(_G.AuctionHouseFrame.CategoriesList, true)
	AS:StripTextures(_G.AuctionHouseFrame.MoneyFrameBorder, true)
	AS:StripTextures(_G.AuctionHouseFrame.MoneyFrameInset, true)

	AS:SkinButton(_G.AuctionHouseFrame.SearchBar.SearchButton)
	AS:SkinEditBox(_G.AuctionHouseFrame.SearchBar.SearchBox)
	AS:SkinButton(_G.AuctionHouseFrame.SearchBar.FavoritesSearchButton)
	AS:SkinButton(_G.AuctionHouseFrame.SearchBar.FilterButton)
	_G.AuctionHouseFrame.SearchBar.FavoritesSearchButton:SetSize(22, 22)

	for _, Filter in ipairs(_G.AuctionHouseFrame.CategoriesList.FilterButtons) do
		AS:SkinBackdropFrame(Filter, nil, nil, true)

		Filter.Backdrop:SetAllPoints(Filter.SelectedTexture)

		Filter.HighlightTexture:SetAtlas(nil)
		Filter.HighlightTexture.SetAtlas = AS.Noop
		Filter.HighlightTexture:SetColorTexture(unpack(AS:CheckOption('HighlightColor')))
		Filter.HighlightTexture:SetAlpha(.4)
		Filter.HighlightTexture.Show = nil

		Filter.SelectedTexture:SetAtlas(nil)
		Filter.SelectedTexture.SetAtlas = AS.Noop
		Filter.SelectedTexture:SetColorTexture(unpack(AS:CheckOption('SelectedColor')))
		Filter.SelectedTexture:SetAlpha(.4)
	end

	AS:StripTextures(_G.AuctionHouseFrame.CategoriesList.ScrollFrame)
	AS:SkinScrollBar(_G.AuctionHouseFrame.CategoriesList.ScrollFrame.ScrollBar)

	AS:StripTextures(_G.AuctionHouseFrame.WoWTokenResults)
	AS:SkinButton(_G.AuctionHouseFrame.WoWTokenResults.Buyout)
	AS:SkinScrollBar(_G.AuctionHouseFrame.WoWTokenResults.DummyScrollBar)

	AS:SkinFrame(_G.AuctionHouseFrame.WoWTokenResults.TokenDisplay)

	AS:SkinTexture(_G.AuctionHouseFrame.WoWTokenResults.TokenDisplay.ItemButton.Icon, true)
	_G.AuctionHouseFrame.WoWTokenResults.TokenDisplay.ItemButton.Icon.Backdrop:SetBackdropBorderColor(0, .8, 1)
	_G.AuctionHouseFrame.WoWTokenResults.TokenDisplay.ItemButton.IconBorder:SetAlpha(0)

	AS:Delay(.1, function()
		for _, Button in pairs(_G.AuctionHouseFrame.BrowseResultsFrame.ItemList.ScrollFrame.buttons) do
			for _, Cell in pairs(Button.cells) do
				if Cell.Icon then
					AS:SkinTexture(Cell.Icon)
				end
			end
		end
	end)

	--[[ Browse Frame ]]--
	local Browse = _G.AuctionHouseFrame.BrowseResultsFrame

	local ItemList = Browse.ItemList
	AS:SkinBackdropFrame(ItemList)
	hooksecurefunc(ItemList, "RefreshScrollFrame", HandleHeaders)

	AS:SkinScrollBar(ItemList.ScrollFrame.scrollBar)

	--[[ BuyOut Frame]]
	local CommoditiesBuyFrame = _G.AuctionHouseFrame.CommoditiesBuyFrame
	CommoditiesBuyFrame.BuyDisplay:StripTextures()
	AS:SkinButton(CommoditiesBuyFrame.BackButton)

	ItemList = _G.AuctionHouseFrame.CommoditiesBuyFrame.ItemList
	ItemList:StripTextures()
	ItemList:CreateBackdrop("Transparent")
	AS:SkinButton(ItemList.RefreshFrame.RefreshButton)
	AS:SkinScrollBar(ItemList.ScrollFrame.scrollBar)

	local BuyDisplay = _G.AuctionHouseFrame.CommoditiesBuyFrame.BuyDisplay
	AS:SkinEditBox(BuyDisplay.QuantityInput.InputBox)
	AS:SkinButton(BuyDisplay.BuyButton)
	SkinItemDisplay(BuyDisplay)

	--[[ ItemBuyOut Frame]]
	local ItemBuyFrame = _G.AuctionHouseFrame.ItemBuyFrame
	AS:SkinButton(ItemBuyFrame.BackButton)
	AS:SkinButton(ItemBuyFrame.BuyoutFrame.BuyoutButton)

	SkinItemDisplay(ItemBuyFrame)

	ItemList = ItemBuyFrame.ItemList
	ItemList:StripTextures()
	ItemList:CreateBackdrop("Transparent")
	AS:SkinScrollBar(ItemList.ScrollFrame.scrollBar)
	AS:SkinButton(ItemList.RefreshFrame.RefreshButton)
	hooksecurefunc(ItemList, "RefreshScrollFrame", HandleHeaders)

	local EditBoxes = {
		_G.AuctionHouseFrameGold,
		_G.AuctionHouseFrameSilver,
	}

	for _, EditBox in pairs(EditBoxes) do
		AS:SkinEditBox(EditBox)
		EditBox:SetTextInsets(1, 1, -1, 1)
	end

	AS:SkinButton(ItemBuyFrame.BidFrame.BidButton)
	ItemBuyFrame.BidFrame.BidButton:ClearAllPoints()
	ItemBuyFrame.BidFrame.BidButton:SetPoint("LEFT", ItemBuyFrame.BidFrame.BidAmount, "RIGHT", 2, -2)
	AS:SkinButton(ItemBuyFrame.BidFrame.BidButton)

	--[[ Item Sell Frame | TAB 2 ]]--
	local SellFrame = _G.AuctionHouseFrame.ItemSellFrame
	local ItemSellList = _G.AuctionHouseFrame.ItemSellList
	local CommoditiesSellFrame = _G.AuctionHouseFrame.CommoditiesSellFrame
	local CommoditiesSellList = _G.AuctionHouseFrame.CommoditiesSellList
	local TokenSellFrame = _G.AuctionHouseFrame.WoWTokenSellFrame

	HandleSellFrame(SellFrame)
	HandleSellList(ItemSellList, true)
	HandleSellFrame(CommoditiesSellFrame)
	HandleSellList(CommoditiesSellList, true)
	HandleTokenSellFrame(TokenSellFrame)

	--[[ Auctions Frame | TAB 3 ]]--
	local AuctionsFrame = _G.AuctionHouseFrameAuctionsFrame
	AS:StripTextures(AuctionsFrame)

	SkinItemDisplay(AuctionsFrame)

	local CommoditiesList = AuctionsFrame.CommoditiesList
	HandleSellList(CommoditiesList, true)
	AS:SkinButton(CommoditiesList.RefreshFrame.RefreshButton)

	local ItemList = AuctionsFrame.ItemList
	HandleSellList(ItemList, true)
	AS:SkinButton(ItemList.RefreshFrame.RefreshButton)

	local Tabs = {
		_G.AuctionHouseFrameAuctionsFrameAuctionsTab,
		_G.AuctionHouseFrameAuctionsFrameBidsTab,
	}

	for _, tab in pairs(Tabs) do
		if tab then
			AS:SkinTab(tab)
		end
	end

	local SummaryList = AuctionsFrame.SummaryList
	HandleSellList(SummaryList)
	AS:SkinButton(AuctionsFrame.CancelAuctionButton)

	local AllAuctionsList = AuctionsFrame.AllAuctionsList
	HandleSellList(AllAuctionsList, true)
	AS:SkinButton(AllAuctionsList.RefreshFrame.RefreshButton)

	local BidsList = AuctionsFrame.BidsList
	HandleSellList(BidsList, true)
	AS:SkinButton(BidsList.RefreshFrame.RefreshButton)
	AS:SkinEditBox(_G.AuctionHouseFrameAuctionsFrameGold)
	AS:SkinEditBox(_G.AuctionHouseFrameAuctionsFrameSilver)
	AS:SkinButton(AuctionsFrame.BidFrame.BidButton)

	AS:UnregisterSkinEvent(addon, event)
end

function AS:Blizzard_BlackMarketUI(event, addon)
	if addon ~= "Blizzard_BlackMarketUI" then return end

	AS:SkinFrame(_G.BlackMarketFrame)
	AS:SkinCloseButton(_G.BlackMarketFrame.CloseButton)

	AS:SkinBackdropFrame(_G.BlackMarketScrollFrame)
	_G.BlackMarketScrollFrame.Backdrop:SetPoint('TOPLEFT', -3, 0)
	_G.BlackMarketScrollFrame.Backdrop:SetPoint('BOTTOMRIGHT', -2, 2)
	AS:SkinScrollBar(_G.BlackMarketScrollFrameScrollBar)

	AS:SkinFrame(_G.BlackMarketFrame.MoneyFrameBorder)
	_G.BlackMarketFrame.MoneyFrameBorder:SetPoint('BOTTOMLEFT', _G.BlackMarketFrame, 'BOTTOMLEFT', 29, 12)
	_G.BlackMarketMoneyFrame:SetPoint("BOTTOMRIGHT", _G.BlackMarketFrame.MoneyFrameBorder, "BOTTOMRIGHT", 8, 4)

	AS:SkinEditBox(_G.BlackMarketBidPriceGold)
	_G.BlackMarketBidPriceGold.Backdrop:SetAllPoints()
	_G.BlackMarketBidPriceGold:SetHeight(16)
	_G.BlackMarketBidPriceGold:SetPoint("BOTTOMRIGHT", _G.BlackMarketFrame.BidButton, "BOTTOMLEFT", -1, 0)

	AS:SkinButton(_G.BlackMarketFrame.BidButton)
	_G.BlackMarketFrame.BidButton:SetHeight(20)
	_G.BlackMarketFrame.BidButton:SetPoint("BOTTOMRIGHT", -285, 12)

	for i = 1, _G.BlackMarketFrame:GetNumRegions() do
		local region = select(i, _G.BlackMarketFrame:GetRegions())
		if region and region:IsObjectType("FontString") and region:GetText() == _G.BLACK_MARKET_TITLE then
			region:ClearAllPoints()
			region:SetPoint("TOP", _G.BlackMarketFrame, "TOP", 0, -4)
		end
	end

	AS:StripTextures(_G.BlackMarketFrame.HotDeal)
	AS:SetTemplate(_G.BlackMarketFrame.HotDeal.Item)
	AS:StyleButton(_G.BlackMarketFrame.HotDeal.Item)
	AS:SkinTexture(_G.BlackMarketFrame.HotDeal.Item.IconTexture)
	AS:SetInside(_G.BlackMarketFrame.HotDeal.Item.IconTexture)
	_G.BlackMarketFrame.HotDeal.Item.IconBorder:SetAlpha(0)

	hooksecurefunc(_G.BlackMarketFrame.HotDeal.Item.IconBorder, 'SetVertexColor', function(self, r, g, b) _G.BlackMarketFrame.HotDeal.Item:SetBackdropBorderColor(r, g, b) end)
	hooksecurefunc(_G.BlackMarketFrame.HotDeal.Item.IconBorder, 'Hide', function() _G.BlackMarketFrame.HotDeal.Item:SetBackdropBorderColor(unpack(AS.BorderColor)) end)

	for _, Tab in pairs({ 'ColumnName', 'ColumnLevel', 'ColumnType', 'ColumnDuration', 'ColumnHighBidder', 'ColumnCurrentBid' }) do
		AS:SkinButton(_G.BlackMarketFrame[Tab])
	end

	hooksecurefunc("BlackMarketScrollFrame_Update", function()
		for _, Button in pairs(_G.BlackMarketScrollFrame.buttons) do
			if not Button.skinned then
				AS:StripTextures(Button)
				AS:StyleButton(Button)
				Button:GetHighlightTexture():SetAllPoints(Button.Selection)
				Button:GetPushedTexture():SetAllPoints(Button.Selection)
				Button.Selection:SetColorTexture(1, 1, 1, .3)
				AS:SkinFrame(Button.Item)
				AS:StyleButton(Button.Item)

				AS:SkinTexture(Button.Item.IconTexture)

				AS:SetInside(Button.Item.IconTexture)
				Button.Item.IconBorder:SetAlpha(0)
				hooksecurefunc(Button.Item.IconBorder, 'SetVertexColor', function(self, r, g, b) Button.Item:SetBackdropBorderColor(r, g, b) end)
				hooksecurefunc(Button.Item.IconBorder, 'Hide', function() Button.Item:SetBackdropBorderColor(unpack(AS.BorderColor)) end)

				Button.skinned = true
			end
		end
	end)

	AS:UnregisterSkinEvent(addon, event)
end

AS:RegisterSkin('Blizzard_AuctionHouseUI', AS.Blizzard_AuctionHouseUI, 'ADDON_LOADED')
AS:RegisterSkin('Blizzard_BlackMarketUI', AS.Blizzard_BlackMarketUI, 'ADDON_LOADED')
