-- This file is only there in standalone Ace3 and provides handy dev tool stuff I guess
-- for now only /rl to reload your UI :)
-- note the complete overkill use of AceAddon and console, ain't it cool?

-- GLOBALS: next, loadstring, ReloadUI, geterrorhandler
-- GLOBALS: BINDING_HEADER_ACE3, BINDING_NAME_RELOADUI, Ace3, LibStub

-- BINDINGs labels
BINDING_HEADER_ACE3 = "Ace3"
BINDING_NAME_RELOADUI = "ReloadUI"
--

local gui = LibStub("AceGUI-3.0")
local reg = LibStub("AceConfigRegistry-3.0")
local dialog = LibStub("AceConfigDialog-3.0")

Ace3 = LibStub("AceAddon-3.0"):NewAddon("Ace3", "AceConsole-3.0")
local Ace3 = Ace3

local selectedgroup
local frame
local select
local status = {}
local configs = {}

local function frameOnClose()
    gui:Release(frame)
    frame = nil
end

local function RefreshConfigs()
    for name in reg:IterateOptionsTables() do
        configs[name] = name
    end
end

local function ConfigSelected(widget, event, value)
    selectedgroup = value
    dialog:Open(value, widget)
end

local old_CloseSpecialWindows

-- GLOBALS: CloseSpecialWindows, next
function Ace3:Open()
    if not old_CloseSpecialWindows then
        old_CloseSpecialWindows = CloseSpecialWindows
        CloseSpecialWindows = function()
            local found = old_CloseSpecialWindows()
            if frame then
                frame:Hide()
                return true
            end
            return found
        end
    end
    RefreshConfigs()
    if next(configs) == nil then
        self:Print("No Configs are Registered")
        return
    end

    if not frame then
        frame = gui:Create("Frame")
        frame:ReleaseChildren()
        frame:SetTitle("Ace3 Options")
        frame:SetLayout("FILL")
        frame:SetCallback("OnClose", frameOnClose)

        select = gui:Create("DropdownGroup")
        select:SetGroupList(configs)
        select:SetCallback("OnGroupSelected", ConfigSelected)
        frame:AddChild(select)
    end
    if not selectedgroup then
        selectedgroup = next(configs)
    end
    select:SetGroup(selectedgroup)
    frame:Show()
end

local function RefreshOnUpdate(this)
    select:SetGroup(selectedgroup)
    this:SetScript("OnUpdate", nil)
end

function Ace3:ConfigTableChanged(event, appName)
    if selectedgroup == appName and frame then
        frame.frame:SetScript("OnUpdate", RefreshOnUpdate)
    end
end

reg.RegisterCallback(Ace3, "ConfigTableChange", "ConfigTableChanged")

function Ace3:PrintCmd(input)
    input = input:trim():match("^(.-);*$")
    local func, err = loadstring("LibStub(\"AceConsole-3.0\"):Print(" .. input .. ")")
    if not func then
        LibStub("AceConsole-3.0"):Print("Error: " .. err)
    else
        func()
    end
end

function Ace3:OnInitialize()
    self:RegisterChatCommand("ace3", function()
        self:Open()
    end)
    self:RegisterChatCommand("rl", function()
        ReloadUI()
    end)
    self:RegisterChatCommand("print", "PrintCmd")
end
