PanicModeCombatAnalyzer = PanicModeCombatAnalyzer or {}

PanicModeCombatAnalyzer.name		  = 'PanicModeCombatAnalyzer'
PanicModeCombatAnalyzer.version	      = '1.0.1'
PanicModeCombatAnalyzer.versionDB	  = 1
PanicModeCombatAnalyzer.loaded	      = false
PanicModeCombatAnalyzer.author        = 'silentgecko, deevilius'
PanicModeCombatAnalyzer.savedVarsName = 'PMCAVars'

PanicModeCombatAnalyzer.variables = {
    fights = {},
    groups = {},
    trials = {},
}
PanicModeCombatAnalyzer.tempVars = {
    lastSave     = 0,
    inFight      = false,
    lastDps      = 0,
    lastDpsCount = 0,
    trialRunning = false,
    trialId      = 0,
}

-- grab ftc from global
FTC = _G['FTC']

---------Passing saved variables to the labels at initialize-------
function PanicModeCombatAnalyzer.Initialize(_, addonName)
    local self = PanicModeCombatAnalyzer

    if addonName ~= self.name then return end

    EVENT_MANAGER:UnregisterForEvent(self.name, EVENT_ADD_ON_LOADED)

    self.savedVariables = ZO_SavedVars:New(self.savedVarsName, self.versionDB, nil, self.variables)

    EVENT_MANAGER:RegisterForEvent(self.name, EVENT_PLAYER_COMBAT_STATE, self.OnPlayerCombatState)

    --trials
    EVENT_MANAGER:RegisterForEvent(self.name .. "_TRIAL_START", EVENT_RAID_TRIAL_STARTED, self.saveTrials)
    EVENT_MANAGER:RegisterForEvent(self.name .. "_TRIAL_STOP", EVENT_RAID_TRIAL_COMPLETE, self.saveTrials)
    EVENT_MANAGER:RegisterForEvent(self.name .. "_TRIAL_STOP", EVENT_RAID_TRIAL_FAILED, self.saveTrials)
    EVENT_MANAGER:RegisterForEvent(self.name .. "_TRIAL_STOP_GROUP", EVENT_GROUP_MEMBER_LEFT, self.saveTrialsFromGroup)
    EVENT_MANAGER:RegisterForEvent(self.name .. "_GROUP_CHANGE", EVENT_GROUP_MEMBER_JOINED, self.saveGroup)
    EVENT_MANAGER:RegisterForEvent(self.name .. "_GROUP_CHANGE", EVENT_GROUP_MEMBER_LEFT, self.saveGroup)
    EVENT_MANAGER:RegisterForEvent(self.name .. "_GROUP_CHANGE", EVENT_GROUP_UPDATE, self.saveGroup)
end

function PanicModeCombatAnalyzer.OnPlayerCombatState(_, inCombat)
    PanicModeCombatAnalyzer.tempVars.inFight = inCombat
end

function PanicModeCombatAnalyzer.saveTrials(event)
    local self         = PanicModeCombatAnalyzer
    local timeStamp    = GetTimeStamp()
    local currentRaid  = GetCurrentParticipatingRaidId()
    local eventStr     = 'start'
    if event == 131134 or event == '131134' then
        self.tempVars.trialRunning = true
        self.tempVars.trialId      = currentRaid
    else
        eventStr = 'stop'
        self.tempVars.trialRunning = false
    end
    self.savedVariables.trials[currentRaid] = self.savedVariables.trials[currentRaid] or {}
    self.savedVariables.trials[currentRaid][timeStamp] = eventStr
end

function PanicModeCombatAnalyzer.saveTrialsFromGroup(_, _, reason)
    local self         = PanicModeCombatAnalyzer
    local timeStamp    = GetTimeStamp()
    local currentRaid  = self.tempVars.trialId -- we use our tempvar, because when you zone out of trial, and still in grp, raidid from api is 0
    local eventStr     = 'stop'

    if (reason == GROUP_LEAVE_REASON_DISBAND or reason == GROUP_LEAVE_REASON_DESTROYED) and currentRaid > 0 and self.tempVars.trialRunning then
        self.savedVariables.trials[currentRaid] = self.savedVariables.trials[currentRaid] or {}
        self.savedVariables.trials[currentRaid][timeStamp] = eventStr
        self.tempVars.trialRunning = false
    end
end

function PanicModeCombatAnalyzer.saveGroup()
    local self      = PanicModeCombatAnalyzer
    local timeStamp = GetTimeStamp()
    local groupSize = GetGroupSize()
    local group     = {}

    -- iterate over group
    if groupSize > 0 then
        self.savedVariables.groups[timeStamp] = self.savedVariables.groups[timeStamp] or {}
        for i = 1, groupSize do
            local unitTag = GetGroupUnitTagByIndex(i)
            if (DoesUnitExist(unitTag)) then
                local charName = zo_strformat("<<!aC:1>>", GetUnitName(unitTag))
                table.insert(group, charName)
            end
        end
        self.savedVariables.groups[timeStamp] = group
        self.debug('saved grp', self.savedVariables.groups[timeStamp])
    end

end

--[[
 * Overwrite from origin FTC
 * Update the mini DPS meter
 * --------------------------------
 * Called by FTC.Stats:Initialize()
 * --------------------------------
 ]]--
function FTC.Stats:Update()
    local self = PanicModeCombatAnalyzer

    -- Bail out if there is no damage to report
    if ( FTC.Stats.damage == 0 and FTC.Stats.healing == 0 ) then return end

    -- Retrieve data
    local mini	= _G["FTC_MiniMeter"]

    -- Compute the fight time
    local time  = ( FTC.Stats.endTime - FTC.Stats.startTime ) / 1000

    -- Determine the correct time label
    local dtime	= (( not IsUnitInCombat('player') ) or ((( GetGameTimeMilliseconds() - FTC.Stats.endTime ) / 1000 ) >= FTC.Vars.DamageTimeout )) and time or ( GetGameTimeMilliseconds() - FTC.Stats.startTime )  / 1000
    local secs	= ZO_FormatTime( dtime , SI_TIME_FORMAT_TIMESTAMP)

    -- Compute player statistics
    local dps 	= FTC.DisplayNumber( FTC.Stats.damage  / math.max(time, 1) )
    local hps 	= FTC.DisplayNumber( FTC.Stats.healing / math.max(time, 1) )

    -- added saving vars
    local lastSave     = self.tempVars.lastSave
    local currentTime  = GetGameTimeMilliseconds()
    local timeStamp    = GetTimeStamp()
    local lastSaveDiff = currentTime - lastSave
    local currenTarget = GetUnitName('reticleover')
    local dpsForSaving = (FTC.Stats.damage / math.max(time,1))

    if self.tempVars.lastDps == dpsForSaving then
        self.tempVars.lastDpsCount = self.tempVars.lastDpsCount + 1
    else
        self.tempVars.lastDpsCount = 0
    end
    self.tempVars.lastDps = dpsForSaving

    -- only save if we don't get three times the same amount of dps, and lastSavediff is more than one second ago and we're in fight
    if self.tempVars.lastDpsCount <= 2 and lastSaveDiff >= 1000 and self.tempVars.inFight then
        self.tempVars.lastSave = currentTime
        self.savedVariables.fights[currenTarget] = self.savedVariables.fights[currenTarget] or {}
        self.savedVariables.fights[currenTarget][timeStamp] = dpsForSaving
        self.debug('saved dps', dps)
    end


    -- Update the labels
    mini.damage.label:SetText( dps )
    mini.healing.label:SetText( hps )
    mini.time.label:SetText( secs )
end

-- debug func
function PanicModeCombatAnalyzer.debug(message, data)
    d('PM CA Debug:')
    d(message, data)
end

---------Events-------
EVENT_MANAGER:RegisterForEvent(PanicModeCombatAnalyzer.name, EVENT_ADD_ON_LOADED, PanicModeCombatAnalyzer.Initialize)