local MAJOR, MINOR = "LibBetterBlizzOptions-1.0", 1
local lib = LibStub:NewLibrary(MAJOR, MINOR)
if not lib then return end

local function makeMovable(frame)
	local mover = _G[frame:GetName() .. "Mover"] or CreateFrame("Frame", frame:GetName() .. "Mover", frame)
	mover:EnableMouse(true)
	mover:SetPoint("TOP", frame, "TOP", 0, 10)
	mover:SetWidth(160)
	mover:SetHeight(40)
	mover:SetScript("OnMouseDown", function(self)
		self:GetParent():StartMoving()
	end)
	mover:SetScript("OnMouseUp", function(self)
		self:GetParent():StopMovingOrSizing()
	end)
	-- mover:SetClampedToScreen(true)		-- doesn't work?
	frame:SetMovable(true)
end

local freeButtons = {
    [InterfaceOptionsFrameCategories] = {},
    [InterfaceOptionsFrameAddOns] = {},
}
local function updateScrollHeight(categoryFrame)
    local buttons = categoryFrame.buttons
    local numButtons = #buttons
    local maxButtons = (categoryFrame:GetTop() - categoryFrame:GetBottom() - 8) / categoryFrame.buttonHeight
    local name = categoryFrame:GetName()

    if numButtons < maxButtons then
        for i = numButtons + 1, maxButtons do
            local button
            if freeButtons[categoryFrame][i] then
                button = freeButtons[categoryFrame][i]
            else
                button = _G[name .. "Button" .. i] or CreateFrame("BUTTON", name .. "Button" .. i, categoryFrame, "InterfaceOptionsListButtonTemplate")
                button:SetPoint("TOPLEFT", buttons[#buttons], "BOTTOMLEFT")
            end
            local listwidth = InterfaceOptionsFrameAddOnsList:GetWidth()
            if InterfaceOptionsFrameAddOnsList:IsShown() then
                button:SetWidth(button:GetWidth() - listwidth)
            end
            tinsert(buttons, button)
            categoryFrame.update()
        end
    else
        for i = numButtons, maxButtons, -1 do
            local button = tremove(buttons, i)
            button:Hide()
            local listwidth = InterfaceOptionsFrameAddOnsList:GetWidth()
            if InterfaceOptionsFrameAddOnsList:IsShown() then
                button:SetWidth(button:GetWidth() + listwidth)
            end
            freeButtons[categoryFrame][i] = button
            categoryFrame.update()
        end
    end
end

local grip = _G.BetterBlizzOptionsResizeGrip or CreateFrame("Frame", "BetterBlizzOptionsResizeGrip", InterfaceOptionsFrame)
grip:EnableMouse(true)
local tex = grip.tex or grip:CreateTexture(grip:GetName() .. "Grip")
grip.tex = tex
tex:SetTexture([[Interface\BUTTONS\UI-AutoCastableOverlay]])
tex:SetTexCoord(0.619, 0.760, 0.612, 0.762)
tex:SetDesaturated(true)
tex:ClearAllPoints()
tex:SetPoint("TOPLEFT")
tex:SetPoint("BOTTOMRIGHT", grip, "TOPLEFT", 12, -12)

-- Deal with BBO base installs
if grip.SetNormalTexture then
	grip:SetNormalTexture(nil)
	grip:SetHighlightTexture(nil)
end
-- tex:SetAllPoints()

grip:SetWidth(22)
grip:SetHeight(21)
grip:SetScript("OnMouseDown", function(self)
	self:GetParent():StartSizing()
end)
grip:SetScript("OnMouseUp", function(self)
	self:GetParent():StopMovingOrSizing()
	updateScrollHeight(InterfaceOptionsFrameCategories)
	updateScrollHeight(InterfaceOptionsFrameAddOns)
end)
grip:SetScript("OnEvent", function(self)
	updateScrollHeight(InterfaceOptionsFrameCategories)
	updateScrollHeight(InterfaceOptionsFrameAddOns)
end)
if not grip:IsEventRegistered("PLAYER_LOGIN") then
	grip:RegisterEvent("PLAYER_LOGIN")
end

grip:ClearAllPoints()
grip:SetPoint("BOTTOMRIGHT")
grip:SetScript("OnEnter", function(self)
	self.tex:SetDesaturated(false)
end)
grip:SetScript("OnLeave", function(self)
	self.tex:SetDesaturated(true)
end)

InterfaceOptionsFrame:SetPoint("CENTER", UIParent, "CENTER")

InterfaceOptionsFrameCategories:SetPoint("BOTTOMLEFT", InterfaceOptionsFrame, "BOTTOMLEFT", 22, 50)
InterfaceOptionsFrameAddOns:SetPoint("BOTTOMLEFT", InterfaceOptionsFrame, "BOTTOMLEFT", 22, 50)

if not InterfaceOptionsFrameAddOns:IsMouseWheelEnabled() then
	InterfaceOptionsFrameAddOns:EnableMouseWheel(true)
	InterfaceOptionsFrameAddOns:SetScript("OnMouseWheel", function(self, dir)
		InterfaceOptionsFrameAddOnsListScrollBar:SetValue(
			InterfaceOptionsFrameAddOnsListScrollBar:GetValue() - (dir * 18)
		)
	end)
end

InterfaceOptionsFrame:SetFrameStrata("FULLSCREEN_DIALOG")
InterfaceOptionsFrame:SetResizable(true)
InterfaceOptionsFrame:SetWidth(900)
InterfaceOptionsFrame:SetMinResize(585, 495)
InterfaceOptionsFrame:SetToplevel(true)

makeMovable(InterfaceOptionsFrame)
makeMovable(ChatConfigFrame)
makeMovable(AudioOptionsFrame)
makeMovable(GameMenuFrame)
makeMovable(VideoOptionsFrame)
if MacOptionsFrame then
   makeMovable(MacOptionsFrame)
end
