local LAM = LibStub:GetLibrary("LibAddonMenu-2.0")


RaidNotifier = {}

RaidNotifier.name		= 'RaidNotifier'
RaidNotifier.slash		= '/rn'
RaidNotifier.version	= '1.1.1'
RaidNotifier.versionDB	= 1
RaidNotifier.loaded	    = false
RaidNotifier.author     = 'silentgecko'
RaidNotifier.savedVarsName  = 'RNVars'
RaidNotifier.variables = {
    sanctum_ophidia = {
        magicka_deto = true,
        poison = true,
    },
}
RaidNotifier.tempVars = {
    last_notify = {
        sanctum_ophidia = {
            magicka_deto = 0,
            poison       = 0
        },
    },
}

local function CreateSettingsMenu()
    local self = RaidNotifier
    ------Creating the menu with LibAddonMenu-2.0 (thank you Seerah)-------
    self.panelData = {
        type = "panel",
        name = self.name,
        author = self.author,
        version = self.version,
        registerForRefresh = false,
    }

    self.optionsData = {
        {
            type = "description",
            text = GetString(RAIDNOTIFIER_DESCRIPTION),
        },
        {
            type = "header",
            name = GetString(RAIDNOTIFIER_SETTINGS_SANCTUM_HEADER),
        },
        {
            type = "checkbox",
            name = GetString(RAIDNOTIFIER_SETTINGS_SANCTUM_MAGICKA_DETONATION),
            tooltip = GetString(RAIDNOTIFIER_SETTINGS_SANCTUM_MAGICKA_DETONATION_TT),
            getFunc = function() return RaidNotifier.savedVariables.sanctum_ophidia.magicka_deto end,
            setFunc = function(value)
                RaidNotifier.savedVariables.sanctum_ophidia.magicka_deto = value
            end,
        },
        {
            type = "checkbox",
            name = GetString(RAIDNOTIFIER_SETTINGS_SANCTUM_POISON),
            tooltip = GetString(RAIDNOTIFIER_SETTINGS_SANCTUM_POISON_TT),
            getFunc = function() return RaidNotifier.savedVariables.sanctum_ophidia.poison end,
            setFunc = function(value)
                RaidNotifier.savedVariables.sanctum_ophidia.poison = value
            end,
        },
    }

    LAM:RegisterAddonPanel("RaidNotifierPanel", self.panelData)
    LAM:RegisterOptionControls("RaidNotifierPanel", self.optionsData)
end


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

    if addonName ~= self.name then return end

    EVENT_MANAGER:UnregisterForEvent(self.name, EVENT_ADD_ON_LOADED)

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

    CreateSettingsMenu()

    EVENT_MANAGER:RegisterForEvent(self.name, EVENT_RAID_TRIAL_STARTED,  RaidNotifier.addEventListeners)
    EVENT_MANAGER:RegisterForEvent(self.name, EVENT_RAID_TRIAL_COMPLETE, RaidNotifier.removeEventListeners)
    EVENT_MANAGER:RegisterForEvent(self.name, EVENT_RAID_TRIAL_FAILED,   RaidNotifier.removeEventListeners)

    if IsRaidInProgress() then
        self.addEventListeners()
    else
        self.removeEventListeners()
    end
end

-- Add Events
function RaidNotifier.addEventListeners()
    local self   = RaidNotifier
    local raidId = GetCurrentParticipatingRaidId()
    -- add sanctum
    if raidId == 3 then
        EVENT_MANAGER:RegisterForEvent(self.name, EVENT_EFFECT_CHANGED, self.sanctumDebuffs)
    end
end

-- Remove all Events
function RaidNotifier.removeEventListeners()
    local self   = RaidNotifier
    local raidId = GetCurrentParticipatingRaidId()

    EVENT_MANAGER:UnregisterForEvent(self.name, EVENT_EFFECT_CHANGED)
end

function RaidNotifier.sanctumDebuffs(_, change, buff, name, unit, start, finish, stack, icon, _, effectType, abilityType, statusEffectType, unitName, unitId, abilityId)
    -- only take care of player
    if (unit ~= 'player') then return end

    local self = RaidNotifier

    -- only notice on effect added
    if (change == EFFECT_RESULT_GAINED) then
        if self.savedVariables.sanctum_ophidia.poison then
            -- i don't know which of these debuffs is the correct, so we add all ;-)
            local poison = {}
            poison[38965] = true
            poison[38968] = true
            poison[38969] = true
            poison[41822] = true
            poison[41823] = true
            poison[41824] = true
            poison[41826] = true
            poison[41827] = true
            poison[41829] = true
            poison[41830] = true
            poison[41832] = true
            poison[41833] = true
            poison[53782] = true
            poison[53786] = true
            poison[53792] = true
            poison[53799] = true
            poison[53815] = true
            poison[54476] = true
            poison[54692] = true
            poison[55085] = true
            poison[55086] = true
            poison[55089] = true
            poison[55148] = true
            poison[57989] = true
            poison[65779] = true
            poison[65780] = true
            poison[65781] = true

            -- only notify when the last one is at least 15 seconds ago and it is poison
            local currentTime = GetTimeStamp()
            local lastNotify  = self.tempVars.last_notify.sanctum_ophidia.poison
            local timeDiff = GetDiffBetweenTimeStamps(currentTime, lastNotify)
            if (poison[abilityId]) and timeDiff > 15 then
                self.tempVars.last_notify.sanctum_ophidia.poison = currentTime
                CENTER_SCREEN_ANNOUNCE:AddMessage(2, CSA_EVENT_COMBINED_TEXT, SOUNDS.CHAMPION_POINTS_COMMITTED, GetString(RAIDNOTIFIER_ALERTS_SANCTUM_POISON), nil, nil, nil, nil, nil, 2000)
            end
        end

        if self.savedVariables.sanctum_ophidia.magicka_deto then
            -- only notify when the last one is at least 10 seconds ago and it is poison
            -- debug abilityId: 30255 / Boundless Storm
            -- Real abilityId: 59036 / "Serp Target"
            local currentTime = GetTimeStamp()
            local lastNotify  = self.tempVars.last_notify.sanctum_ophidia.magicka_deto
            local timeDiff = GetDiffBetweenTimeStamps(currentTime, lastNotify)
            if (abilityId == 59036) and timeDiff > 10 then
                self.tempVars.last_notify.sanctum_ophidia.magicka_deto = currentTime

                -- get current magicka percentage
                local current, maximum, _ = GetUnitPower("player", POWERTYPE_MAGICKA)
                local magickaPercentage   = zo_roundToNearest(current/maximum,0.01) * 100

                -- only notify if the current magicka is over 15%
                if magickaPercentage > 15 then
                    CENTER_SCREEN_ANNOUNCE:AddMessage(1, CSA_EVENT_COMBINED_TEXT, SOUNDS.CHAMPION_POINTS_COMMITTED, GetString(RAIDNOTIFIER_ALERTS_SANCTUM_MAGICKA_DETONATION), nil, nil, nil, nil, nil, 5000)
                end
            end
        end
    end
end

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