local Totemicons = mUI:NewModule("mUI.Modules.Nameplates.Totemicons", "AceHook-3.0")

function Totemicons:OnInitialize()
    -- Load Libraries
    Totemicons.glow = LibStub("LibCustomGlow-1.0")

    -- Create Frame
    Totemicons.frame = CreateFrame("Frame")

    -- Variables
    Totemicons.startTimes = setmetatable({
        __mode = "v"
    }, {})

    -- Tables
    Totemicons.active = {}
    Totemicons.toglow = {
        [105427] = true,
        [5925] = true,
        [5913] = true
    }
    Totemicons.totems = {
        [2630] = {2484, 20}, -- Earthbind
        [60561] = {51485, 20}, -- Earthgrab
        [3527] = {5394, 15}, -- Healing Stream
        [6112] = {8512, 120}, -- Windfury
        [97369] = {192222, 15}, -- Liquid Magma
        [5913] = {8143, 10}, -- Tremor
        [5925] = {204336, 3}, -- Grounding
        [78001] = {157153, 15}, -- Cloudburst
        [53006] = {98008, 6}, -- Spirit Link
        [59764] = {108280, 12}, -- Healing Tide
        [61245] = {192058, 2}, -- Static Charge
        [100943] = {198838, 15}, -- Earthen Wall
        [97285] = {192077, 15}, -- Wind Rush
        [105451] = {204331, 15}, -- Counterstrike
        [104818] = {207399, 30}, -- Ancestral
        [105427] = {204330, 15}, -- Skyfury
        [179867] = {355580, 6}, -- Static Field
        [166523] = {324386, 30}, -- Vesper Totem (Kyrian)

        -- Warrior
        [119052] = {236320, 15}, -- War Banner

        -- Priest
        [101398] = {211522, 12} -- Psyfiend
    }

    function Totemicons:GetNPCIDByGUID(guid)
        local _, _, _, _, _, npcID = strsplit("-", guid)
        return tonumber(npcID)
    end

    function Totemicons:CreateIcon(nameplate)
        local frame = CreateFrame("Frame", nil, nameplate)
        frame:SetSize(25, 25)
        frame:SetPoint("BOTTOM", nameplate, "TOP", 0, 5)

        local icon = frame:CreateTexture(nil, "ARTWORK")
        icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
        icon:SetAllPoints()

        local bg = frame:CreateTexture(nil, "BACKGROUND")
        bg:SetTexture("Interface\\BUTTONS\\WHITE8X8")
        bg:SetVertexColor(0, 0, 0, 0.5)
        bg:SetPoint("TOPLEFT", frame, "TOPLEFT", -2, 2)
        bg:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", 2, -2)

        local cd = CreateFrame("Cooldown", nil, frame, "CooldownFrameTemplate")
        cd.noCooldownCount = true
        cd:SetHideCountdownNumbers(true)
        cd:SetReverse(true)
        cd:SetDrawEdge(false)
        cd:SetAllPoints(frame)

        frame.cooldown = cd
        frame.icon = icon
        frame.bg = bg

        return frame
    end

    function Totemicons:NAME_PLATE_UNIT_ADDED(event, unit)
        local nameplate = C_NamePlate.GetNamePlateForUnit(unit)
        local guid = UnitGUID(unit)
        local npcID = Totemicons:GetNPCIDByGUID(guid)

        if npcID and Totemicons.totems[npcID] then
            local isFriendly = UnitReaction(unit, "player") >= 4
            -- if isFriendly then return end

            if not nameplate.mUITotemIcon then
                nameplate.mUITotemIcon = Totemicons:CreateIcon(nameplate)
            end

            local iconFrame = nameplate.mUITotemIcon
            iconFrame:Show()

            local totemData = Totemicons.totems[npcID]
            local spellID, duration = unpack(totemData)

            local tex = C_Spell.GetSpellTexture(spellID)

            iconFrame.icon:SetTexture(tex)
            local startTime = Totemicons.startTimes[guid]
            if startTime then
                iconFrame.cooldown:SetCooldown(startTime, duration)
                iconFrame.cooldown:Show()
            end

            if Totemicons.toglow[npcID] then
                iconFrame:SetSize(35, 35)
                Totemicons.glow.ButtonGlow_Start(iconFrame, {1, 0, 0.3, 1})
            end

            Totemicons.active[guid] = nameplate
        end
    end

    function Totemicons:NAME_PLATE_UNIT_REMOVED(event, unit)
        local nameplate = C_NamePlate.GetNamePlateForUnit(unit)
        if nameplate.mUITotemIcon then
            local guid = UnitGUID(unit)
            local npcID = Totemicons:GetNPCIDByGUID(guid)

            nameplate.mUITotemIcon:Hide()

            if Totemicons.toglow[npcID] then
                nameplate.mUITotemIcon:SetSize(25, 25)
                Totemicons.glow.ButtonGlow_Stop(nameplate.mUITotemIcon)
            end

            Totemicons.active[guid] = nil
        end
    end

    function Totemicons:COMBAT_LOG_EVENT_UNFILTERED(event, unit)
        local timestamp, eventType, hideCaster, srcGUID, srcName, srcFlags, srcFlags2, dstGUID, dstName, dstFlags, dstFlags2 =
            CombatLogGetCurrentEventInfo()

        if eventType == "SPELL_SUMMON" then
            local npcID = Totemicons:GetNPCIDByGUID(dstGUID)
            if npcID and Totemicons.totems[npcID] then
                Totemicons.startTimes[dstGUID] = GetTime()
            end
        end
    end
end

function Totemicons:OnEnable()
    Totemicons.frame:RegisterEvent("NAME_PLATE_UNIT_ADDED")
    Totemicons.frame:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
    Totemicons.frame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
    Totemicons:SecureHookScript(Totemicons.frame, "OnEvent", function(_, event, ...)
        return Totemicons[event](self, event, ...)
    end)
end

function Totemicons:OnDisable()
    Totemicons.frame:UnregisterAllEvents()
    Totemicons:UnhookAll()
end
