

local Details = _G.Details
local DF = _G.DetailsFramework

local _

function Details:InitializeMacrosWindow()
    local DetailsMacrosPanel = DF:CreateSimplePanel (UIParent, 700, 480, "Details! Useful Macros", "DetailsMacrosPanel")
    DetailsMacrosPanel.Frame = DetailsMacrosPanel
    DetailsMacrosPanel.__name = "Macros"
    DetailsMacrosPanel.real_name = "DETAILS_MACROSWINDOW"
    DetailsMacrosPanel.__icon = [[Interface\MacroFrame\MacroFrame-Icon]]
    DetailsMacrosPanel.__iconcoords = {0, 1, 0, 1}
    DetailsMacrosPanel.__iconcolor = "white"
    DetailsPluginContainerWindow.EmbedPlugin (DetailsMacrosPanel, DetailsMacrosPanel, true)
    
    function DetailsMacrosPanel.RefreshWindow()
        Details.OpenMacrosWindow()
    end
    
    DetailsMacrosPanel:Hide()
end

function Details.OpenMacrosWindow()

    if (not DetailsMacrosPanel or not DetailsMacrosPanel.Initialized) then

        DetailsMacrosPanel.Initialized = true
        local f = DetailsMacrosPanel or DF:CreateSimplePanel (UIParent, 700, 480, "Details! Useful Macros", "DetailsMacrosPanel")
        
        local scrollbox_line_backdrop_color = {0, 0, 0, 0.2}
        local scrollbox_line_backdrop_color_onenter = {.3, .3, .3, 0.5}
        local scrollbox_lines = 7
        local scrollbox_line_height = 79.5
        local scrollbox_size = {890, 563}
        
        f.bg1 = f:CreateTexture (nil, "background")
        f.bg1:SetTexture ([[Interface\AddOns\Details\images\background]], true)
        f.bg1:SetAlpha (0.8)
        f.bg1:SetVertexColor (0.27, 0.27, 0.27)
        f.bg1:SetVertTile (true)
        f.bg1:SetHorizTile (true)
        f.bg1:SetSize (790, 454)
        f.bg1:SetAllPoints()
        f:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true})
        f:SetBackdropColor (.5, .5, .5, .7)
        f:SetBackdropBorderColor (0, 0, 0, 1)
        
        local macrosAvailable = Details.MacroList
    
        local OnEnterMacroButton = function (self)
            self:SetBackdropColor (unpack (scrollbox_line_backdrop_color_onenter))
        end
        
        local onLeaveMacroButton = function (self)
            self:SetBackdropColor (unpack (scrollbox_line_backdrop_color))
        end
        
        local updateMacroLine = function (self, index, title, desc, macroText)
            self.Title:SetText (title)
            self.Desc:SetText (desc)
            self.MacroTextEntry:SetText (macroText)
        end
        
        local textEntryOnFocusGained = function (self)
            self:HighlightText()
        end
        
        local textEntryOnFocusLost = function (self)
            self:HighlightText (0, 0)
        end

        local refreshMacroScrollbox = function (self, data, offset, totalLines)
            for i = 1, totalLines do
                local index = i + offset
                local macro = macrosAvailable [index]
                if (macro) then
                    local line = self:GetLine (i)
                    line:UpdateLine (index, macro.Name, macro.Desc, macro.MacroText)
                end
            end
        end
        
        local macroListCreateLine = function (self, index)
            --create a new line
            local line = CreateFrame ("button", "$parentLine" .. index, self,"BackdropTemplate")
            
            --set its parameters
            line:SetPoint ("topleft", self, "topleft", 0, -((index-1) * (scrollbox_line_height+1)))
            line:SetSize (scrollbox_size[1], scrollbox_line_height)
            line:SetScript ("OnEnter", OnEnterMacroButton)
            line:SetScript ("OnLeave", onLeaveMacroButton)
            line:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true, edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1})
            line:SetBackdropColor (unpack (scrollbox_line_backdrop_color))
            line:SetBackdropBorderColor (0, 0, 0, 0.3)
            
            local titleLabel = DF:CreateLabel (line, "", DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE"))
            titleLabel.textsize = 14
            titleLabel.textcolor = "yellow"
            local descLabel = DF:CreateLabel (line, "", DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE"))
            descLabel.textsize = 12
            
            local options_dropdown_template = DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")
            options_dropdown_template = DF.table.copy ({}, options_dropdown_template)
            options_dropdown_template.backdropcolor = {.51, .51, .51, .3}
            options_dropdown_template.onenterbordercolor = {.51, .51, .51, .2}
            
            local textEntry = DF:CreateTextEntry (line, function()end, scrollbox_size[1] - 10, 40, "MacroTextEntry", _, _, options_dropdown_template)
            textEntry:SetHook ("OnEditFocusGained", textEntryOnFocusGained)
            textEntry:SetHook ("OnEditFocusLost", textEntryOnFocusLost)
            textEntry:SetJustifyH ("left")
            textEntry:SetTextInsets (8, 8, 0, 0)
            
            titleLabel:SetPoint ("topleft", line, "topleft", 5, -5)
            descLabel:SetPoint ("topleft", titleLabel, "bottomleft", 0, -2)
            textEntry:SetPoint ("topleft", descLabel, "bottomleft", 0, -4)
            
            line.Title = titleLabel
            line.Desc = descLabel
            line.MacroTextEntry = textEntry
        
            line.UpdateLine = updateMacroLine
            line:Hide()
            
            return line
        end
        
        local macroScrollbox = DF:CreateScrollBox (f, "$parentMacroScrollbox", refreshMacroScrollbox, macrosAvailable, scrollbox_size[1], scrollbox_size[2], scrollbox_lines, scrollbox_line_height)
        macroScrollbox:SetPoint ("topleft", f, "topleft", 5, -30)
        macroScrollbox:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
        macroScrollbox:SetBackdropColor (0, 0, 0, 0)
        macroScrollbox:SetBackdropBorderColor (0, 0, 0, 1)
        f.MacroScrollbox = macroScrollbox
        DF:ReskinSlider (macroScrollbox)
        
        macroScrollbox.__background:Hide()
        
        --create the scrollbox lines
        for i = 1, scrollbox_lines do 
            macroScrollbox:CreateLine (macroListCreateLine)
        end
    end
    
    DetailsPluginContainerWindow.OpenPlugin (DetailsMacrosPanel)
    DetailsMacrosPanel.MacroScrollbox:Refresh()
    DetailsMacrosPanel:Show()
end
