local LAM = LibStub( 'LibAddonMenu-1.0' )
if ( not LAM ) then return end

local LMP = LibStub( 'LibMediaProvider-1.0' )
if ( not LMP ) then return end
LMP:Register( LMP.MediaType.FONT, 'DejaVu Sans Mono', [[_framerate/fonts/dejavusansmono.ttf]] )

local CBM = CALLBACK_MANAGER
local _framerateConfig = {}

local defaults =
{
    font_face = 'DejaVu Sans Mono',
    font_size = '10',
    font_decoration = 'shadow',

    colors =
    {
        bad     = { 255, 0, 0, 1 },
        okay    = { 255, 255, 0, 1 },
        good    = { 0, 255, 0, 1  }
    }
}

local decorations = { 'none', 'soft-shadow-thin', 'soft-shadow-thick', 'shadow' }

function _framerateConfig:FormatFont( face, size, decoration )
    local format = '%s|%d'
    if ( decoration ~= 'none' ) then
        format = format .. '|%s'
    end

    return string.format( format, LMP:Fetch( LMP.MediaType.FONT, face ), size, decoration )
end

function _framerateConfig:OnLoaded()
    self.db             = ZO_SavedVars:NewAccountWide( 'FRAMERATE_DB', 1.0, nil, defaults )
    self.config_panel   = LAM:CreateControlPanel( '_framerate_config', '_framerate' )

    self:CreateConfig()

    self:OnColorsChanged()
    self:OnFontChanged()
end

function _framerateConfig:CreateConfig()
    LAM:AddHeader( self.config_panel, '_framerate_header_font', 'Font' )

    LAM:AddDropdown( self.config_panel, '_framerate_font', 'Font:', '',  LMP:List( LMP.MediaType.FONT ),
        function() return self.db.font_face end,
        function( face )
            self.db.font_face = face
            self:OnFontChanged()
        end )

    LAM:AddSlider( self.config_panel, '_framerate_size', 'Size:', '', 8, 50, 1,
        function() return self.db.font_size end,
        function( size )
            self.db.font_size = size
            self:OnFontChanged()
        end )

    LAM:AddDropdown( self.config_panel, '_framerate_decoration', 'Decoration:', '', decorations,
        function() return self.db.font_decoration end,
        function( deco )
            self.db.font_decoration = deco
            self:OnFontChanged()
        end )

    LAM:AddHeader( self.config_panel, '_framerate_header_colors', 'Colors' )

    LAM:AddColorPicker( self.config_panel, '_framerate_color_good', 'Good:', '',
        function() return unpack( self.db.colors.good ) end,
        function( r, g, b, a )
            self.db.colors.good = { r,g,b,a }
            self:OnColorsChanged()
        end )

    LAM:AddColorPicker( self.config_panel, '_framerate_color_okay', 'Okay:', '',
        function() return unpack( self.db.colors.okay ) end,
        function( r, g, b, a )
            self.db.colors.okay = { r,g,b,a }
            self:OnColorsChanged()
        end )

    LAM:AddColorPicker( self.config_panel, '_framerate_color_bad', 'Bad:', '',
        function() return unpack( self.db.colors.bad ) end,
        function( r, g, b, a )
            self.db.colors.bad = { r,g,b,a }
            self:OnColorsChanged()
        end )
end

function _framerateConfig:OnColorsChanged()
    CBM:FireCallbacks( '_FRAMERATE_COLORS_CHANGED', self.db.colors.good, self.db.colors.okay, self.db.colors.bad )
end

function _framerateConfig:OnFontChanged()
    CBM:FireCallbacks( '_FRAMERATE_FONT_CHANGED', self:FormatFont( self.db.font_face, self.db.font_size, self.db.font_decoration ) )
end

CBM:RegisterCallback( '_FRAMERATE_LOADED', function() _framerateConfig:OnLoaded() end )