

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

function Details:InitializePlaterIntegrationWindow()
    local DetailsPlaterIntegrationPanel = DF:CreateSimplePanel (UIParent, 700, 480, "Details! Plater Nameplates Integration", "DetailsPlaterIntegrationPanel")
    DetailsPlaterIntegrationPanel.Frame = DetailsPlaterIntegrationPanel
    DetailsPlaterIntegrationPanel.__name = "Plater Nameplates"
    DetailsPlaterIntegrationPanel.real_name = "DETAILS_PLATERWINDOW"
    DetailsPlaterIntegrationPanel.__icon = [[Interface\AddOns\Details\images\plater_icon]]
    DetailsPlaterIntegrationPanel.__iconcoords = {0, 1, 0, 1}
    DetailsPlaterIntegrationPanel.__iconcolor = "white"
    DetailsPluginContainerWindow.EmbedPlugin (DetailsPlaterIntegrationPanel, DetailsPlaterIntegrationPanel, true)

    function DetailsPlaterIntegrationPanel.RefreshWindow()
        Details.OpenPlaterIntegrationWindow()
    end

    DetailsPlaterIntegrationPanel:Hide()
end

function Details.OpenPlaterIntegrationWindow()
    if (not DetailsPlaterIntegrationPanel or not DetailsPlaterIntegrationPanel.Initialized) then
        
        DetailsPlaterIntegrationPanel.Initialized = true
        
        local f = DetailsPlaterIntegrationPanel or DF:CreateSimplePanel (UIParent, 700, 480, "Details! Plater Nameplates Integration", "DetailsPlaterIntegrationPanel")
        
        --background
        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)

        --> anchor text function
        local anchor_names = {"Top Left", "Left", "Bottom Left", "Bottom", "Bottom Right", "Right", "Top Right", "Top", "Center", "Inner Left", "Inner Right", "Inner Top", "Inner Bottom"}
        local build_anchor_side_table = function (member)
            local t = {}
            for i = 1, 13 do
                tinsert (t, {
                    label = anchor_names[i],
                    value = i,
                    onclick = function (_, _, value)
                        Details.plater [member].side = value
                        if (Plater) then
                            Plater.UpdateAllPlates()
                        end
                    end
                })
            end
            return t
        end				
        
        local menu_table = {
        
            {type = "label", get = function() return "Add Real Time DPS Info in the Nameplate:" end, text_template = DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")},
        
            --> real time dps from all sources
            {
                type = "toggle",
                get = function() return Details.plater.realtime_dps_enabled end,
                set = function (self, fixedparam, value) 
                    Details.plater.realtime_dps_enabled = value
                    
                    Details:RefreshPlaterIntegration()
                    
                    if (not value) then
                        Details:Msg ("a /reload might be needed to disable this setting.")
                    else
                        if (Plater) then
                            Plater.RefreshDBUpvalues()
                        end
                    end
                end,
                name = "Show Real Time Dps",
                desc = "Show Real Time DPS on the nameplate.\n\nReal time DPS is how much damage has been inflicted to the unit in the last 5 seconds.",
            },
                --> text size
                {
                    type = "range",
                    get = function() return Details.plater.realtime_dps_size end,
                    set = function (self, fixedparam, value) 
                        Details.plater.realtime_dps_size = value
                        if (Plater) then
                            Plater.UpdateAllPlates()
                        end
                    end,
                    min = 6,
                    max = 32,
                    step = 1,
                    name = "Text Size",
                    desc = "Text Size",
                },
                --> text color
                {
                    type = "color",
                    get = function() 
                        local color = Details.plater.realtime_dps_color
                        return {color [1], color [2], color [3], color [4]}
                    end,
                    set = function (self, r, g, b, a) 
                        local color = Details.plater.realtime_dps_color
                        color[1], color[2], color[3], color[4] = r, g, b, a
                        if (Plater) then
                            Plater.UpdateAllPlates()
                        end
                    end,
                    desc = "Text Color",
                    name = "Text Color",
                    text_template = options_text_template,
                },
                --> text shadow
                {
                    type = "toggle",
                    get = function() return Details.plater.realtime_dps_shadow end,
                    set = function (self, fixedparam, value) 
                        Details.plater.realtime_dps_shadow = value
                        if (Plater) then
                            Plater.UpdateAllPlates()
                        end
                    end,
                    name = "Text Shadow",
                    desc = "Text Shadow",
                },
                --> text anchor
                    --anchor location
                    {
                        type = "select",
                        get = function() return Details.plater.realtime_dps_anchor.side end,
                        values = function() return build_anchor_side_table ("realtime_dps_anchor") end,
                        name = "Anchor Point",
                        desc = "Which side of the nameplate the text is attach to.",
                    },
                    --anchor x offset
                    {
                        type = "range",
                        get = function() return Details.plater.realtime_dps_anchor.x end,
                        set = function (self, fixedparam, value) 
                            Details.plater.realtime_dps_anchor.x = value
                            if (Plater) then
                                Plater.UpdateAllPlates()
                            end
                        end,
                        min = -20,
                        max = 20,
                        step = 1,
                        name = "Anchor X Offset",
                        desc = "Slightly move the text horizontally.",
                    },
                    --anchor x offset
                    {
                        type = "range",
                        get = function() return Details.plater.realtime_dps_anchor.y end,
                        set = function (self, fixedparam, value) 
                            Details.plater.realtime_dps_anchor.y = value
                            if (Plater) then
                                Plater.UpdateAllPlates()
                            end
                        end,
                        min = -20,
                        max = 20,
                        step = 1,
                        name = "Anchor Y Offset",
                        desc = "Slightly move the text vertically.",
                    },	
            
            {type = "breakline"},
            {type = "label", get = function() return "Add Real Time DPS Info Only From You in the Nameplate:" end, text_template = DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")},
            
            --> real time dps from the player only
            {
                type = "toggle",
                get = function() return Details.plater.realtime_dps_player_enabled end,
                set = function (self, fixedparam, value) 
                    Details.plater.realtime_dps_player_enabled = value
                    
                    Details:RefreshPlaterIntegration()
                    
                    if (not value) then
                        Details:Msg ("a /reload might be needed to disable this setting.")
                    else
                        if (Plater) then
                            Plater.RefreshDBUpvalues()
                        end
                    end
                end,
                name = "Show Real Time Dps (From You)",
                desc = "Show Real Time DPS you are currently applying in the unit.\n\nReal time DPS is how much damage has been inflicted to the unit in the last 5 seconds.",
            },
                --> text size
                {
                    type = "range",
                    get = function() return Details.plater.realtime_dps_player_size end,
                    set = function (self, fixedparam, value) 
                        Details.plater.realtime_dps_player_size = value
                        if (Plater) then
                            Plater.UpdateAllPlates()
                        end
                    end,
                    min = 6,
                    max = 32,
                    step = 1,
                    name = "Text Size",
                    desc = "Text Size",
                },
                --> text color
                {
                    type = "color",
                    get = function() 
                        local color = Details.plater.realtime_dps_player_color
                        return {color [1], color [2], color [3], color [4]}
                    end,
                    set = function (self, r, g, b, a) 
                        local color = Details.plater.realtime_dps_player_color
                        color[1], color[2], color[3], color[4] = r, g, b, a
                        if (Plater) then
                            Plater.UpdateAllPlates()
                        end
                    end,
                    desc = "Text Color",
                    name = "Text Color",
                    text_template = options_text_template,
                },
                --> text shadow
                {
                    type = "toggle",
                    get = function() return Details.plater.realtime_dps_player_shadow end,
                    set = function (self, fixedparam, value) 
                        Details.plater.realtime_dps_player_shadow = value
                        if (Plater) then
                            Plater.UpdateAllPlates()
                        end
                    end,
                    name = "Text Shadow",
                    desc = "Text Shadow",
                },
                --> text anchor
                    --anchor location
                    {
                        type = "select",
                        get = function() return Details.plater.realtime_dps_player_anchor.side end,
                        values = function() return build_anchor_side_table ("realtime_dps_player_anchor") end,
                        name = "Anchor Point",
                        desc = "Which side of the nameplate the text is attach to.",
                    },
                    --anchor x offset
                    {
                        type = "range",
                        get = function() return Details.plater.realtime_dps_player_anchor.x end,
                        set = function (self, fixedparam, value) 
                            Details.plater.realtime_dps_player_anchor.x = value
                            if (Plater) then
                                Plater.UpdateAllPlates()
                            end
                        end,
                        min = -20,
                        max = 20,
                        step = 1,
                        name = "Anchor X Offset",
                        desc = "Slightly move the text horizontally.",
                    },
                    --anchor x offset
                    {
                        type = "range",
                        get = function() return Details.plater.realtime_dps_player_anchor.y end,
                        set = function (self, fixedparam, value) 
                            Details.plater.realtime_dps_player_anchor.y = value
                            if (Plater) then
                                Plater.UpdateAllPlates()
                            end
                        end,
                        min = -20,
                        max = 20,
                        step = 1,
                        name = "Anchor Y Offset",
                        desc = "Slightly move the text vertically.",
                    },	
            
            {type = "breakline"},
            {type = "label", get = function() return "Add Total Damage Taken in the Nameplate:" end, text_template = DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")},
            
            --> total damage taken from all sources
            {
                type = "toggle",
                get = function() return Details.plater.damage_taken_enabled end,
                set = function (self, fixedparam, value) 
                    Details.plater.damage_taken_enabled = value
                    
                    Details:RefreshPlaterIntegration()
                    
                    if (not value) then
                        Details:Msg ("a /reload might be needed to disable this setting.")
                    else
                        if (Plater) then
                            Plater.RefreshDBUpvalues()
                        end
                    end
                end,
                name = "Show Total Damage Taken",
                desc = "Show the total damage taken by the unit",
            },
                --> text size
                {
                    type = "range",
                    get = function() return Details.plater.damage_taken_size end,
                    set = function (self, fixedparam, value) 
                        Details.plater.damage_taken_size = value
                        if (Plater) then
                            Plater.UpdateAllPlates()
                        end
                    end,
                    min = 6,
                    max = 32,
                    step = 1,
                    name = "Text Size",
                    desc = "Text Size",
                },
                --> text color
                {
                    type = "color",
                    get = function() 
                        local color = Details.plater.damage_taken_color
                        return {color [1], color [2], color [3], color [4]}
                    end,
                    set = function (self, r, g, b, a) 
                        local color = Details.plater.damage_taken_color
                        color[1], color[2], color[3], color[4] = r, g, b, a
                        if (Plater) then
                            Plater.UpdateAllPlates()
                        end
                    end,
                    desc = "Text Color",
                    name = "Text Color",
                    text_template = options_text_template,
                },
                --> text shadow
                {
                    type = "toggle",
                    get = function() return Details.plater.damage_taken_shadow end,
                    set = function (self, fixedparam, value) 
                        Details.plater.damage_taken_shadow = value
                        if (Plater) then
                            Plater.UpdateAllPlates()
                        end
                    end,
                    name = "Text Shadow",
                    desc = "Text Shadow",
                },
                --> text anchor
                    --anchor location
                    {
                        type = "select",
                        get = function() return Details.plater.damage_taken_anchor.side end,
                        values = function() return build_anchor_side_table ("damage_taken_anchor") end,
                        name = "Anchor Point",
                        desc = "Which side of the nameplate the text is attach to.",
                    },
                    --anchor x offset
                    {
                        type = "range",
                        get = function() return Details.plater.damage_taken_anchor.x end,
                        set = function (self, fixedparam, value) 
                            Details.plater.damage_taken_anchor.x = value
                            if (Plater) then
                                Plater.UpdateAllPlates()
                            end
                        end,
                        min = -20,
                        max = 20,
                        step = 1,
                        name = "Anchor X Offset",
                        desc = "Slightly move the text horizontally.",
                    },
                    --anchor x offset
                    {
                        type = "range",
                        get = function() return Details.plater.damage_taken_anchor.y end,
                        set = function (self, fixedparam, value) 
                            Details.plater.damage_taken_anchor.y = value
                            if (Plater) then
                                Plater.UpdateAllPlates()
                            end
                        end,
                        min = -20,
                        max = 20,
                        step = 1,
                        name = "Anchor Y Offset",
                        desc = "Slightly move the text vertically.",
                    },
        }
        
        local options_text_template = DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")
        local options_dropdown_template = DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")
        local options_switch_template = DF:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE")
        local options_slider_template = DF:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE")
        local options_button_template = DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE")
        
        local titleBackground = CreateFrame ("frame", nil, f,"BackdropTemplate")
        titleBackground:SetPoint ("topleft", f, "topleft", 10, -30)
        titleBackground:SetPoint ("topright", f, "topright", -10, -30)
        titleBackground:SetHeight (80)
        
        --background
        titleBackground.bg1 = titleBackground:CreateTexture (nil, "background")
        titleBackground.bg1:SetTexture ([[Interface\AddOns\Details\images\background]])
        titleBackground.bg1:SetAlpha (0.8)
        titleBackground.bg1:SetVertexColor (0.27, 0.27, 0.27)
        titleBackground.bg1:SetVertTile (true)
        titleBackground.bg1:SetHorizTile (true)
        titleBackground.bg1:SetSize (790, 454)
        titleBackground.bg1:SetAllPoints()
        titleBackground:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true})
        titleBackground:SetBackdropColor (.5, .5, .5, .7)
        titleBackground:SetBackdropBorderColor (0, 0, 0, 1)
        
        local platerTitle = DF:CreateLabel (titleBackground, "Plater Nameplates Integration", 16, "white")
        local platerDesc1 = DF:CreateLabel (titleBackground, "Add DPS and Damage information directly into the nameplate", 11, "silver")
        local platerDesc2 = DF:CreateLabel (titleBackground, "See how much damage the enemy is taking in real time!", 11, "silver")
        local platerImage = DF:CreateImage (titleBackground, "Interface\\AddOns\\Details\\images\\plater_image")
        platerImage:SetSize (256, 64)
        
        platerImage:SetPoint ("topright", f, "topright", -150, -35)
        platerTitle:SetPoint (10, -15)
        platerDesc1:SetPoint (10, -35)
        platerDesc2:SetPoint (10, -47)
        
        DF:BuildMenu (f, menu_table, 10, -140, 460, true, options_text_template, options_dropdown_template, options_switch_template, true, options_slider_template, options_button_template)
        
        if (not Plater) then
            for _, widget in ipairs (f.widget_list) do
                if (widget.Disable) then
                    widget:Disable()
                end
            end
            
            local PlaterDisabled1 = DF:CreateLabel (f, "Plater isn't installed! you may download it from the Curseforge app.", 16, "red")
            PlaterDisabled1:SetPoint (10, -330)
        end
        
    end
    
    DetailsPluginContainerWindow.OpenPlugin (DetailsPlaterIntegrationPanel)
end