local PSBT_Module       = PSBT_Module
local PSBT_Experience   = PSBT_Module:Subclass()
local CBM               = CALLBACK_MANAGER

local zo_min            = zo_min
local tostring          = tostring

local PSBT_AREAS        = PSBT_AREAS
local PSBT_EVENTS       = PSBT_EVENTS
local PSBT_MODULES      = PSBT_MODULES

function PSBT_Experience:Initialize( ... )
    PSBT_Module.Initialize( self, ... )

    self._currentExperience = GetUnitXP( 'player' )

    self:RegisterForEvent( EVENT_EXPERIENCE_UPDATE, function( event, ... ) self:OnXPUpdated( ... )     end )
end

function PSBT_Experience:OnXPUpdated( tag, exp, maxExp, reason  )
    if ( tag ~= 'player' ) then
        return
    end

    local xp = zo_min( exp, maxExp )

    if ( self._currentExperience == xp ) then
        return
    end

    local gain = xp - self._currentExperience
    self._currentExperience = xp

    if ( gain <= 0 ) then
        return
    end

    self:NewEvent( PSBT_AREAS.NOTIFICATION, true, nil, '+' .. tostring( gain ) .. ' XP' )
end



CBM:RegisterCallback( PSBT_EVENTS.LOADED,
    function( psbt )
        psbt:RegisterModule( PSBT_MODULES.XP, PSBT_Experience:New( psbt ) )
    end)