PanicModeCombatAnalyzer = PanicModeCombatAnalyzer or {}

PanicModeCombatAnalyzer.name		  = 'PanicModeCombatAnalyzer'
PanicModeCombatAnalyzer.version	      = '1.0.5'
PanicModeCombatAnalyzer.versionDB	  = 2
PanicModeCombatAnalyzer.loaded	      = false
PanicModeCombatAnalyzer.author        = 'silentgecko, deevilius'
PanicModeCombatAnalyzer.savedVarsName = 'PMCAVars'

PanicModeCombatAnalyzer.variables = {
    data = {},
    metadata = {
        server = 'EU',
        language = 'de',
    }
}
PanicModeCombatAnalyzer.tempVars = {
    lastSave     = 0,
    lastSaveTimeStamp = 0,
    inFight      = false,
    lastDps      = 0,
    lastDpsCount = 0,
    trialRunning = false,
    trialId      = 0,
}

PanicModeCombatAnalyzer.ignoredAbilities = {}
PanicModeCombatAnalyzer.ignoredAbilities[52790] = true
PanicModeCombatAnalyzer.ignoredAbilities[38541] = true
PanicModeCombatAnalyzer.ignoredAbilities[43380] = true
PanicModeCombatAnalyzer.ignoredAbilities[43381] = true
PanicModeCombatAnalyzer.ignoredAbilities[38527] = true
PanicModeCombatAnalyzer.ignoredAbilities[36287] = true
PanicModeCombatAnalyzer.ignoredAbilities[46184] = true
PanicModeCombatAnalyzer.ignoredAbilities[35942] = true
PanicModeCombatAnalyzer.ignoredAbilities[68359] = true
PanicModeCombatAnalyzer.ignoredAbilities[62491] = true
PanicModeCombatAnalyzer.ignoredAbilities[62490] = true
PanicModeCombatAnalyzer.ignoredAbilities[61898] = true
PanicModeCombatAnalyzer.ignoredAbilities[48019] = true
PanicModeCombatAnalyzer.ignoredAbilities[47570] = true
PanicModeCombatAnalyzer.ignoredAbilities[15383] = true
PanicModeCombatAnalyzer.ignoredAbilities[21929] = true
PanicModeCombatAnalyzer.ignoredAbilities[68464] = true
PanicModeCombatAnalyzer.ignoredAbilities[68463] = true

---------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)
    self.savedVariables.data = {}
    --save current server and language
    self.savedVariables.metadata = {
        server = GetWorldName(),
        language = GetCVar('language.2')
    }

    self.cleanUp()

    CALLBACK_MANAGER:RegisterCallback("FTC_NewDamage", self.addDamage)
end

-- cleanup
function PanicModeCombatAnalyzer.cleanUp()
    local self      = PanicModeCombatAnalyzer
    local savedVars = self.savedVariables.data
    local currentTs = GetTimeStamp()
    local limitTs   = currentTs - 604800 -- one week in seconds

    for ts, data in pairs(savedVars) do
        if ts <= limitTs then
            self.savedVariables.data[ts] = nil
        end
    end
end

-- get current trial
function PanicModeCombatAnalyzer.getTrial()
    local self         = PanicModeCombatAnalyzer
    local currentRaid  = GetCurrentParticipatingRaidId() or 0
    return currentRaid
end

-- get dmg from FTC
function PanicModeCombatAnalyzer.addDamage(damage)
    local self = PanicModeCombatAnalyzer

    --only log outgoing stuff and greater than zero
    if damage['out'] and damage['value'] > 0 then
        local data         = self.savedVariables.data or {}
        local lastSave     = self.tempVars.lastSave
        local lastSaveTS   = self.tempVars.lastSaveTimeStamp
        local currentTime  = GetGameTimeMilliseconds()
        local timeStamp    = GetTimeStamp()
        local lastSaveDiff = currentTime - lastSave

        -- if the last saving data is 1 sek ago, make a new table
        if lastSaveDiff >= 1000 then
            lastSaveTS = timeStamp
            self.tempVars.lastSaveTimeStamp = timeStamp
            self.tempVars.lastSave          = currentTime
        end
        data[lastSaveTS]            = data[lastSaveTS] or {}
        data[lastSaveTS]['damage']  = data[lastSaveTS]['damage'] or {}
        data[lastSaveTS]['healing'] = data[lastSaveTS]['healing'] or {}

        local damageData = {
            abilityId = damage['abilityId'],
            damage    = damage['value'],
            crit      = damage['crit'],
            ms        = damage['ms'],
            ability   = damage['ability'],
        }

        if damage['heal'] then
            local currentData = data[lastSaveTS]['healing'][damage['target']] or {}
            table.insert(currentData, damageData)
            data[lastSaveTS]['healing'][damage['target']] = currentData
        else
            --filter unwanted stuff
            if self.ignoredAbilities[damage['ability']] ~= true then
                local currentData = data[lastSaveTS]['damage'][damage['target']] or {}
                table.insert(currentData, damageData)
                data[lastSaveTS]['damage'][damage['target']] = currentData
            end
        end

        data[lastSaveTS]['group'] = self.getGroup()
        data[lastSaveTS]['trial'] = self.getTrial()

        self.savedVariables.data[lastSaveTS] = data[lastSaveTS]
    end
end

-- get group
function PanicModeCombatAnalyzer.getGroup()
    local self      = PanicModeCombatAnalyzer
    local groupSize = GetGroupSize()
    local group     = {}

    -- iterate over group
    if groupSize > 0 then
        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
    end

    return group
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)