local Type, Version = "mUI_Button", 24
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then
    return
end

-- Lua APIs
local pairs = pairs

-- WoW APIs
local _G = _G
local PlaySound, CreateFrame, UIParent = PlaySound, CreateFrame, UIParent

--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
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()
        else
            self.frame:Enable()
        end
    end
}

--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local function Constructor()
    local name = "AceGUI30Button" .. AceGUI:GetNextWidgetNum(Type)
    local frame = CreateFrame("Button", name, UIParent, "UIPanelButtonTemplate")
    frame:Hide()

    frame:EnableMouse(true)
    frame:SetScript("OnClick", Button_OnClick)
    frame:SetScript("OnEnter", Control_OnEnter)
    frame:SetScript("OnLeave", Control_OnLeave)

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

    frame:SetNormalTexture("Interface\\AddOns\\mUI\\Media\\Textures\\Config\\button_normal.png")
    frame:SetHighlightTexture("Interface\\AddOns\\mUI\\Media\\Textures\\Config\\button_highlight.png")
    frame:SetPushedTexture("Interface\\AddOns\\mUI\\Media\\Textures\\Config\\button_pressed.png")
    frame:SetDisabledTexture("Interface\\AddOns\\mUI\\Media\\Textures\\Config\\button_disabled.png")

    -- Add spacing by insetting the content region slightly
    local normalTex = frame:GetNormalTexture()
    local highlightTex = frame:GetHighlightTexture()
    local pushedTex = frame:GetPushedTexture()
    local disabledTex = frame:GetDisabledTexture()

    for _, tex in pairs({normalTex, highlightTex, pushedTex, disabledTex}) do
        if tex then
            tex:ClearAllPoints()
            tex:SetPoint("TOPLEFT", frame, "TOPLEFT", 1, 0)
            tex:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -1, 0)
        end
    end

    frame.Left:Hide()
    frame.Middle:Hide()
    frame.Right:Hide()

    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)
