local E, L, V, P, G = unpack(select(2, ...)) --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
local S = E:GetModule("Skins")

--Lua functions
local _G = _G
local unpack = unpack
--WoW API / Variables
local GetBuybackItemInfo = GetBuybackItemInfo
local GetItemInfo = GetItemInfo
local GetItemQualityColor = GetItemQualityColor
local GetMerchantNumItems = GetMerchantNumItems

S:AddCallback("Skin_Merchant", function()
	if not E.private.skins.blizzard.enable or not E.private.skins.blizzard.merchant then return end
	local extLoaded = IsAddOnLoaded("ExtVendor")
	local MerchantFrame = _G.MerchantFrame
	MerchantFrame:StripTextures(true)
	MerchantFrame:CreateBackdrop("Transparent")
	MerchantFrame.backdrop:Point("TOPLEFT", 11, -12)
	MerchantFrame.backdrop:Point("BOTTOMRIGHT", -32, 76)

	S:SetUIPanelWindowInfo(MerchantFrame, "width")
	S:SetBackdropHitRect(MerchantFrame)

	MerchantFrame:EnableMouseWheel(true)
	MerchantFrame:SetScript("OnMouseWheel", function(_, value)
		if value > 0 then
			if MerchantPrevPageButton:IsShown() and MerchantPrevPageButton:IsEnabled() == 1 then
				MerchantPrevPageButton_OnClick()
			end
		else
			if MerchantNextPageButton:IsShown() and MerchantNextPageButton:IsEnabled() == 1 then
				MerchantNextPageButton_OnClick()
			end
		end
	end)

	S:HandleCloseButton(MerchantFrameCloseButton, MerchantFrame.backdrop)

	local function skinMerchantButton(buttonName, buyback)
		local button = _G[buttonName]
		local itemButton = _G[buttonName.."ItemButton"]
		local icon = _G[buttonName.."ItemButtonIconTexture"]
		local name = _G[buttonName.."Name"]
		local nameFrame = _G[buttonName.."NameFrame"]
		local money = _G[buttonName.."MoneyFrame"]
		local slot = _G[buttonName.."SlotTexture"]

		button:StripTextures(true)
		button:CreateBackdrop("Default")
		button.backdrop:Point("TOPLEFT", -2, 2)

		if buyback then
			button.backdrop:Point("BOTTOMRIGHT", 4, -13)
		else
			button.backdrop:Point("BOTTOMRIGHT", 4, -6)
		end

		itemButton:StripTextures()
		itemButton:StyleButton()
		itemButton:SetTemplate("Default", true)
		itemButton:Size(40)
		itemButton:Point("TOPLEFT", 4, -4)

		icon:SetTexCoord(unpack(E.TexCoords))
		icon:SetInside()

		name:Point("LEFT", slot, "RIGHT", -4, 5)
		nameFrame:Point("LEFT", slot, "RIGHT", -6, -17)

		money:ClearAllPoints()
		money:Point("BOTTOMLEFT", itemButton, "BOTTOMRIGHT", 3, 0)

		if not buyback then
			for j = 1, 2 do
				local currencyItem = _G[buttonName.."AltCurrencyFrameItem"..j]
				local currencyIcon = _G[buttonName.."AltCurrencyFrameItem"..j.."Texture"]

				currencyIcon.backdrop = CreateFrame("Frame", nil, currencyItem)
				currencyIcon.backdrop:SetTemplate("Default")
				currencyIcon.backdrop:SetFrameLevel(currencyItem:GetFrameLevel())
				currencyIcon.backdrop:SetOutside(currencyIcon)

				currencyIcon:SetTexCoord(unpack(E.TexCoords))
				currencyIcon:SetParent(currencyIcon.backdrop)
			end
		end
	end

	for i = 1, 20 do
		if _G["MerchantItem"..i] then
			skinMerchantButton("MerchantItem"..i)

			if not extLoaded then
				if i % 2 == 0 then
					_G["MerchantItem"..i]:Point("TOPLEFT", _G["MerchantItem"..i-1], "TOPRIGHT", 13, 0)
				end
			end
		end
	end

	skinMerchantButton("MerchantBuyBackItem", true)

	S:HandleNextPrevButton(MerchantNextPageButton, nil, nil, true)
	S:HandleNextPrevButton(MerchantPrevPageButton, nil, nil, true)

	S:HandleCheckBox(MerchantFrameSellJunkFrameAutoSellCheck)

	S:HandleButton(MerchantRepairItemButton)

	if extLoaded then
		S:HandleEditBox(MerchantFrameSearchBox)
		S:HandleButton(MerchantFrameFilterButton)
	end

	MerchantRepairItemButton:StyleButton(false)
	-- texWidth, texHeight, cropWidth, cropHeight, offsetX, offsetY = 128, 64, 26, 26, 5, 6
	MerchantRepairItemButton:GetRegions():SetTexCoord(0.0390625, 0.2421875, 0.09375, 0.5)
	MerchantRepairItemButton:GetRegions():SetInside()

	S:HandleButton(MerchantRepairAllButton)
	MerchantRepairAllIcon:StyleButton(false)
	-- texWidth, texHeight, cropWidth, cropHeight, offsetX, offsetY = 128, 64, 26, 26, 41, 6
	MerchantRepairAllIcon:SetTexCoord(0.3203125, 0.5234375, 0.09375, 0.5)
	MerchantRepairAllIcon:SetInside()

	S:HandleButton(MerchantGuildBankRepairButton)
	MerchantGuildBankRepairButton:StyleButton()
	-- texWidth, texHeight, cropWidth, cropHeight, offsetX, offsetY = 128, 64, 26, 26, 77, 6
	MerchantGuildBankRepairButtonIcon:SetTexCoord(0.6015625, 0.8046875, 0.09375, 0.5)
	MerchantGuildBankRepairButtonIcon:SetInside()

	S:HandleTab(MerchantFrameTab1)
	S:HandleTab(MerchantFrameTab2)

	MerchantNameText:Point("TOP", -6, -22)

	MerchantItem1:SetPoint("TOPLEFT", 21, -54)

	MerchantFrameSellJunkFrameAutoSellCheck:Point("BOTTOMLEFT", MerchantFrame, "BOTTOMLEFT", 18, 80)
	MerchantRepairSettingsButton:Point("BOTTOM", MerchantFrame, "BOTTOM", -38, 112)
	if not extLoaded then
		MerchantPrevPageButton:Point("CENTER", MerchantFrame, "BOTTOMLEFT", 37, 172)
		MerchantNextPageButton:Point("CENTER", MerchantFrame, "BOTTOMLEFT", 324, 172)
	
		MerchantPageText:Point("BOTTOM", -14, 166)
	
		MerchantBuyBackItem:Point("TOPLEFT", MerchantItem10, "BOTTOMLEFT", 0, -39)
	end

	MerchantGuildBankRepairButton:Point("LEFT", MerchantRepairAllButton, "RIGHT", 5, 0)
	MerchantRepairItemButton:Point("RIGHT", MerchantRepairAllButton, "LEFT", -5, 0)
	MerchantRepairItemButton.SetPoint = E.noop

	MerchantMoneyFrame:Point("BOTTOMRIGHT", -30, 86)

	MerchantFrameTab1:Point("CENTER", MerchantFrame, "BOTTOMLEFT", 54, 62)
	MerchantFrameTab2:Point("LEFT", MerchantFrameTab1, "RIGHT", -15, 0)

	hooksecurefunc(MerchantRepairAllButton, "Show", function(self)
		-- CanMerchantRepair && CanGuildBankRepair
		if self:GetWidth() == 32 then
			MerchantRepairText:SetPoint("CENTER", MerchantFrame, "BOTTOMLEFT", 82, 151)
			MerchantRepairAllButton:Point("BOTTOMRIGHT", MerchantFrame, "BOTTOMLEFT", 100, 105)
		else
			MerchantRepairText:SetPoint("BOTTOMLEFT", MerchantFrame, "BOTTOMLEFT", 11, 125)
			MerchantRepairAllButton:Point("BOTTOMRIGHT", MerchantFrame, "BOTTOMLEFT", 157, extLoaded and 103 or 113)
		end
	end)

	hooksecurefunc("MerchantFrame_UpdateMerchantInfo", function()
		local numMerchantItems = GetMerchantNumItems()
		local index = (MerchantFrame.page - 1) * MERCHANT_ITEMS_PER_PAGE
		local _, button, name, quality

		-- for i = 1, BUYBACK_ITEMS_PER_PAGE do
		for i = 1, MERCHANT_ITEMS_PER_PAGE do
			index = index + 1

			if index <= numMerchantItems then
				button = _G["MerchantItem"..i.."ItemButton"]
				name = _G["MerchantItem"..i.."Name"]

				if button.link then
					_, _, quality = GetItemInfo(button.link)

					if quality then
						local r, g, b = GetItemQualityColor(quality)
						button:SetBackdropBorderColor(r, g, b)
						name:SetTextColor(r, g, b)
					else
						button:SetBackdropBorderColor(unpack(E.media.bordercolor))
						name:SetTextColor(1, 1, 1)
					end
				else
					button:SetBackdropBorderColor(unpack(E.media.bordercolor))
					name:SetTextColor(1, 1, 1)
				end
			end

			local itemName = GetBuybackItemInfo(GetNumBuybackItems())
			if itemName then
				_, _, quality = GetItemInfo(itemName)

				if quality then
					local r, g, b = GetItemQualityColor(quality)
					MerchantBuyBackItemItemButton:SetBackdropBorderColor(r, g, b)
					MerchantBuyBackItemName:SetTextColor(r, g, b)
				else
					MerchantBuyBackItemItemButton:SetBackdropBorderColor(unpack(E.media.bordercolor))
					MerchantBuyBackItemName:SetTextColor(1, 1, 1)
				end
			else
				MerchantBuyBackItemItemButton:SetBackdropBorderColor(unpack(E.media.bordercolor))
			end
		end
		if not extLoaded then
			MerchantItem3:SetPoint("TOPLEFT", "MerchantItem1", "BOTTOMLEFT", 0, -11)
			MerchantItem5:SetPoint("TOPLEFT", "MerchantItem3", "BOTTOMLEFT", 0, -11)
			MerchantItem7:SetPoint("TOPLEFT", "MerchantItem5", "BOTTOMLEFT", 0, -11)
			MerchantItem9:SetPoint("TOPLEFT", "MerchantItem7", "BOTTOMLEFT", 0, -11)
		end
	end)

	hooksecurefunc("MerchantFrame_UpdateBuybackInfo", function()
		local numBuybackItems = GetNumBuybackItems()
		local _, button, name, quality

		for i = 1, BUYBACK_ITEMS_PER_PAGE do
			if i <= numBuybackItems then
				local itemName = GetBuybackItemInfo(i)

				if itemName then
					button = _G["MerchantItem"..i.."ItemButton"]
					name = _G["MerchantItem"..i.."Name"]
					_, _, quality = GetItemInfo(itemName)

					if quality then
						local r, g, b = GetItemQualityColor(quality)
						button:SetBackdropBorderColor(r, g, b)
						name:SetTextColor(r, g, b)
					else
						button:SetBackdropBorderColor(unpack(E.media.bordercolor))
						name:SetTextColor(1, 1, 1)
					end
				end
			end
		end

		if not extLoaded then
			MerchantItem3:SetPoint("TOPLEFT", "MerchantItem1", "BOTTOMLEFT", 0, -15)
			MerchantItem5:SetPoint("TOPLEFT", "MerchantItem3", "BOTTOMLEFT", 0, -15)
			MerchantItem7:SetPoint("TOPLEFT", "MerchantItem5", "BOTTOMLEFT", 0, -15)
			MerchantItem9:SetPoint("TOPLEFT", "MerchantItem7", "BOTTOMLEFT", 0, -15)
		end
	end)
end)
