--- @class StdUi
local StdUi = LibStub and LibStub('StdUi', true);
if not StdUi then
	return
end

local module, version = 'Button', 6;
if not StdUi:UpgradeNeeded(module, version) then return end;

local SquareButtonCoords = {
	UP = {     0.45312500,    0.64062500,     0.01562500,     0.20312500};
	DOWN = {   0.45312500,    0.64062500,     0.20312500,     0.01562500};
	LEFT = {   0.23437500,    0.42187500,     0.01562500,     0.20312500};
	RIGHT = {  0.42187500,    0.23437500,     0.01562500,     0.20312500};
	DELETE = { 0.01562500,    0.20312500,     0.01562500,     0.20312500};
};

---@class StdUi.SquareButton : Button, SquareButtonMethods
---@field icon Texture
---@field iconDisabled Texture

---@class SquareButtonMethods
local SquareButtonMethods = {
	SetIconDisabled = function(self, texture, iconWidth, iconHeight)
		self.iconDisabled = self.stdUi:Texture(self, iconWidth, iconHeight, texture);
		self.iconDisabled:SetDesaturated(true);
		self.iconDisabled:SetPoint('CENTER', 0, 0);

		self:SetDisabledTexture(self.iconDisabled);
	end,

	SetIcon = function(self, texture, iconWidth, iconHeight, alsoDisabled)
		self.icon = self.stdUi:Texture(self, iconWidth, iconHeight, texture);
		self.icon:SetPoint('CENTER', 0, 0);

		self:SetNormalTexture(self.icon);

		if alsoDisabled then
			self:SetIconDisabled(texture, iconWidth, iconHeight);
		end
	end
};

function StdUi:SquareButton(parent, width, height, icon)
	local button = CreateFrame('Button', name, parent); ---@type StdUi.SquareButton
	button.stdUi = self;

	self:InitWidget(button);
	self:SetObjSize(button, width, height);

	self:ApplyBackdrop(button);
	self:HookDisabledBackdrop(button);
	self:HookHoverBorder(button);

	for k, v in pairs(SquareButtonMethods) do
		button[k] = v;
	end

	local coords = SquareButtonCoords[icon];
	if coords then
		button:SetIcon([[Interface\Buttons\SquareButtonTextures]], 16, 16, true);
		button.icon:SetTexCoord(coords[1], coords[2], coords[3], coords[4]);
		button.iconDisabled:SetTexCoord(coords[1], coords[2], coords[3], coords[4]);
	end

	return button;
end

function StdUi:ButtonLabel(parent, text)
	local label = self:Label(parent, text);
	label:SetJustifyH('CENTER');
	self:GlueAcross(label, parent, 2, -2, -2, 2);
	parent:SetFontString(label);

	return label;
end

function StdUi:HighlightButtonTexture(button)
	local hTex = self:Texture(button, nil, nil, nil);
	hTex:SetColorTexture(
		self.config.highlight.color.r,
		self.config.highlight.color.g,
		self.config.highlight.color.b,
		self.config.highlight.color.a
	);
	hTex:SetAllPoints();

	return hTex;
end

--- Creates a button with only a highlight
--- @return Button
function StdUi:HighlightButton(parent, width, height, text, inherit, name)
	local button = CreateFrame('Button', name, parent, inherit);
	self:InitWidget(button);
	self:SetObjSize(button, width, height);
	button.text = self:ButtonLabel(button, text);

	function button:SetFontSize(newSize)
		self.text:SetFontSize(newSize);
	end

	local hTex = self:HighlightButtonTexture(button);
	hTex:SetBlendMode('ADD');

	button:SetHighlightTexture(hTex);
	button.highlightTexture = hTex;

	return button;
end

--- @return Button
function StdUi:Button(parent, width, height, text, inherit, name)
	local button = self:HighlightButton(parent, width, height, text, inherit, name)
	button.stdUi = self;

	button:SetHighlightTexture('');

	self:ApplyBackdrop(button);
	self:HookDisabledBackdrop(button);
	self:HookHoverBorder(button);

	return button;
end

function StdUi:ButtonAutoWidth(button, padding)
	padding = padding or 5;
	button:SetWidth(button.text:GetStringWidth() + padding * 2);
end

StdUi:RegisterModule(module, version);