--[[-----------------------------------------------------------------------------
Button Widget (Modified to change text color on SetDisabled method and add Drag and Drop support for Filter lists)
Graphical Button.
-------------------------------------------------------------------------------]]
local Type, Version = "Button-ElvUI", 4
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

local pairs = pairs
local CreateFrame = CreateFrame
local IsShiftKeyDown = IsShiftKeyDown
local PlaySound = PlaySound
local UIParent = UIParent
local DragTooltip = CreateFrame("GameTooltip", "ElvUIAceGUIWidgetDragTooltip", UIParent, "GameTooltipTemplate")
-- GLOBALS: ElvUI

--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
local dragdropButton
local function lockTooltip()
	_G.ElvUIAceConfigDialogTooltip:Hide()

	DragTooltip:ClearAllPoints()
	DragTooltip:SetOwner(UIParent, "ANCHOR_CURSOR")
	DragTooltip:SetText(" ")
	DragTooltip:Show()
end
local function dragdrop_OnMouseDown(frame, ...)
	if frame.obj.dragOnMouseDown then
		dragdropButton.mouseDownFrame = frame
		dragdropButton:SetText(frame.obj.value or "Unknown")
		dragdropButton:SetSize(frame:GetSize())
		frame.obj.dragOnMouseDown(frame, ...)
	end
end
local function dragdrop_OnMouseUp(frame, ...)
	if frame.obj.dragOnMouseUp then
		frame:SetAlpha(1)
		if dragdropButton.enteredFrame and dragdropButton.enteredFrame ~= frame and dragdropButton.enteredFrame:IsMouseOver() then
			frame.obj.dragOnMouseUp(frame, ...)
			frame.obj.ActivateMultiControl(frame.obj, ...)
		end

		DragTooltip:Hide()
		dragdropButton:Hide()
		dragdropButton.enteredFrame = nil
		dragdropButton.mouseDownFrame = nil
	end
end
local function dragdrop_OnLeave(frame, ...)
	if frame.obj.dragOnLeave then
		if dragdropButton.mouseDownFrame then
			lockTooltip()
		end
		if frame == dragdropButton.mouseDownFrame then
			frame:SetAlpha(0)
			dragdropButton:Show()
			frame.obj.dragOnLeave(frame, ...)
		end
	end
end
local function dragdrop_OnEnter(frame, ...)
	if frame.obj.dragOnEnter and dragdropButton:IsShown() then
		dragdropButton.enteredFrame = frame
		lockTooltip()
		frame.obj.dragOnEnter(frame, ...)
	end
end
local function dragdrop_OnClick(frame, ...)
	local button = ...
	if frame.obj.dragOnClick and button == "RightButton" then
		frame.obj.dragOnClick(frame, ...)
		frame.obj.ActivateMultiControl(frame.obj, ...)
	elseif frame.obj.stateSwitchOnClick and (button == "LeftButton") and IsShiftKeyDown() then
		frame.obj.stateSwitchOnClick(frame, ...)
		frame.obj.ActivateMultiControl(frame.obj, ...)
	end
end

local function Button_OnClick(frame, ...)
	AceGUI:ClearFocus()
	PlaySound(852) -- SOUNDKIT.IG_MAINMENU_OPTION
	frame.obj:Fire("OnClick", ...)
end

local function Control_OnEnter(frame)
	frame.obj:Fire("OnEnter")
end

local function Control_OnLeave(frame)
	frame.obj:Fire("OnLeave")
end

--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
	["OnAcquire"] = function(self)
		-- restore default values
		self:SetHeight(24)
		self:SetWidth(200)
		self:SetDisabled(false)
		self:SetAutoWidth(false)
		self:SetText()
	end,

	-- ["OnRelease"] = nil,

	["SetText"] = function(self, text)
		self.text:SetText(text)
		if self.autoWidth then
			self:SetWidth(self.text:GetStringWidth() + 30)
		end
	end,

	["SetAutoWidth"] = function(self, autoWidth)
		self.autoWidth = autoWidth
		if self.autoWidth then
			self:SetWidth(self.text:GetStringWidth() + 30)
		end
	end,

	["SetDisabled"] = function(self, disabled)
		self.disabled = disabled
		if disabled then
			self.frame:Disable()
			self.text:SetTextColor(0.4, 0.4, 0.4)
		else
			self.frame:Enable()
			self.text:SetTextColor(1, 0.82, 0)
		end
	end
}

--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local S -- ref for Skins module in ElvUI
local function Constructor()
	local name = "AceGUI30Button" .. AceGUI:GetNextWidgetNum(Type)
	local frame = CreateFrame("Button", name, UIParent, "UIPanelButtonTemplate")
	frame:Hide()
	frame:EnableMouse(true)
	frame:RegisterForClicks("AnyUp")
	frame:SetScript("OnClick", Button_OnClick)
	frame:SetScript("OnEnter", Control_OnEnter)
	frame:SetScript("OnLeave", Control_OnLeave)

	-- dragdrop
	if not dragdropButton then
		dragdropButton = CreateFrame("Button", "ElvUIAceGUI30DragDropButton", UIParent, "UIPanelButtonTemplate")
		dragdropButton:SetFrameStrata("TOOLTIP")
		dragdropButton:SetFrameLevel(5)
		dragdropButton:SetPoint('BOTTOM', DragTooltip, "BOTTOM", 0, 10)
		dragdropButton:Hide()

		if not S then
			S = ElvUI[1]:GetModule("Skins")

			-- skin this once :)
			DragTooltip:SetTemplate("Transparent", nil, true)
		end

		S:HandleButton(dragdropButton)
	end

	frame:HookScript("OnClick", dragdrop_OnClick)
	frame:HookScript("OnEnter", dragdrop_OnEnter)
	frame:HookScript("OnLeave", dragdrop_OnLeave)
	frame:HookScript("OnMouseUp", dragdrop_OnMouseUp)
	frame:HookScript("OnMouseDown", dragdrop_OnMouseDown)

	local text = frame:GetFontString()
	text:ClearAllPoints()
	text:SetPoint("TOPLEFT", 15, -1)
	text:SetPoint("BOTTOMRIGHT", -15, 1)
	text:SetJustifyV("MIDDLE")

	local widget = {
		text  = text,
		frame = frame,
		type  = Type
	}
	for method, func in pairs(methods) do
		widget[method] = func
	end

	return AceGUI:RegisterAsWidget(widget)
end

AceGUI:RegisterWidgetType(Type, Constructor, Version)
