local RF_Textures = mUI:NewModule("mUI.Modules.Unitframes.Raidframes_Textures", "AceHook-3.0")

function RF_Textures:OnInitialize()
    -- Load LSM
    RF_Textures.LSM = LibStub("LibSharedMedia-3.0")

    -- Load Database
    RF_Textures.db = mUI.db.profile.unitframes.textures

    -- Hide Partyframe Title
    CompactPartyFrameTitle:Hide()

    -- Tables
    RF_Textures.frames = {"PartyFrameMember1", "PartyFrameMember2", "PartyFrameMember3", "PartyFrameMember4", "PartyFrameMember5", "PartyFramePet1",
                          "PartyFramePet2", "PartyFramePet3", "PartyFramePet4", "PartyFramePet5", "RaidFrame1", "RaidFrame2", "RaidFrame3",
                          "RaidFrame4", "RaidFrame5", "RaidFrame6", "RaidFrame7", "RaidFrame8", "RaidFrame9", "RaidFrame10", "RaidFrame11",
                          "RaidFrame12", "RaidFrame13", "RaidFrame14", "RaidFrame15", "RaidFrame16", "RaidFrame17", "RaidFrame18", "RaidFrame19",
                          "RaidFrame20", "RaidFrame21", "RaidFrame22", "RaidFrame23", "RaidFrame24", "RaidFrame25", "RaidFrame26", "RaidFrame27",
                          "RaidFrame28", "RaidFrame29", "RaidFrame30", "RaidFrame31", "RaidFrame32", "RaidFrame33", "RaidFrame34", "RaidFrame35",
                          "RaidFrame36", "RaidFrame37", "RaidFrame38", "RaidFrame39", "RaidFrame40", "RaidGroup1Member1", "RaidGroup1Member2",
                          "RaidGroup1Member3", "RaidGroup1Member4", "RaidGroup1Member5", "RaidGroup2Member1", "RaidGroup2Member2",
                          "RaidGroup2Member3", "RaidGroup2Member4", "RaidGroup2Member5", "RaidGroup3Member1", "RaidGroup3Member2",
                          "RaidGroup3Member3", "RaidGroup3Member4", "RaidGroup3Member5", "RaidGroup4Member1", "RaidGroup4Member2",
                          "RaidGroup4Member3", "RaidGroup4Member4", "RaidGroup4Member5", "RaidGroup5Member1", "RaidGroup5Member2",
                          "RaidGroup5Member3", "RaidGroup5Member4", "RaidGroup5Member5", "RaidGroup6Member1", "RaidGroup6Member2",
                          "RaidGroup6Member3", "RaidGroup6Member4", "RaidGroup6Member5", "RaidGroup7Member1", "RaidGroup7Member2",
                          "RaidGroup7Member3", "RaidGroup7Member4", "RaidGroup7Member5", "RaidGroup8Member1", "RaidGroup8Member2",
                          "RaidGroup8Member3", "RaidGroup8Member4", "RaidGroup8Member5"}

    RF_Textures.defaultTextures = {
        health = [[Interface\RaidFrame\Raid-Bar-Hp-Fill]],
        power = [[Interface\RaidFrame\Raid-Bar-Resource-Fill]]
    }

    function RF_Textures:SetTextures(frame)
        if not frame then
            return
        end

        local ok, forbidden = pcall(function() return frame:IsForbidden() end)
        if not ok or forbidden then
            return
        end

        local name = frame:GetName()
        if not name or not name:match("^Compact") then
            return
        end

        local texture = RF_Textures.LSM:Fetch('statusbar', RF_Textures.db.raidframes)
        if RF_Textures.db.raidframes ~= "None" then
            frame.healthBar:SetStatusBarTexture(texture)
            frame.powerBar:SetStatusBarTexture(texture)
            frame.myHealPrediction:SetTexture(texture)
            frame.otherHealPrediction:SetTexture(texture)

            frame.healthBar:GetStatusBarTexture():SetDrawLayer("BORDER")
            frame.powerBar:GetStatusBarTexture():SetDrawLayer("BORDER")
        else
            frame.healthBar:SetStatusBarTexture(RF_Textures.defaultTextures.health)
            frame.powerBar:SetStatusBarTexture(RF_Textures.defaultTextures.power)
            frame.myHealPrediction:SetTexture(RF_Textures.defaultTextures.health)
            frame.otherHealPrediction:SetTexture(RF_Textures.defaultTextures.health)
        end

        -- Use custom selection highlight texture
        frame.selectionHighlight:SetTexture([[Interface\AddOns\mUI\Media\Textures\Raidframes\border.png]])
        frame.aggroHighlight:SetTexture([[Interface\AddOns\mUI\Media\Textures\Raidframes\border.png]])
    end

    function RF_Textures:UpdatePowerColor(frame)
        if not frame then
            return
        end

        local ok, forbidden = pcall(function() return frame:IsForbidden() end)
        if not ok or forbidden then
            return
        end

        local name = frame:GetName()
        if not name or not name:match("^Compact") then
            return
        end

        local _, powerType = UnitPowerType(frame.unit)
        if type(powerType) ~= "string" then
            return
        end

        local color = PowerBarColor[powerType]
        if powerType == "MANA" and color then
            frame.powerBar:SetStatusBarColor(0, 0.50196081399918, 1, 1)
        end
    end

    function RF_Textures:Update()
        for _, frame in pairs(RF_Textures.frames) do
            RF_Textures:SetTextures(_G["Compact" .. frame])
        end
    end
end

function RF_Textures:OnEnable()
    RF_Textures:SecureHook("CompactUnitFrame_UpdateHealthColor", function(frame)
        RF_Textures:SetTextures(frame)
    end)

    RF_Textures:SecureHook("CompactUnitFrame_UpdatePowerColor", function(frame)
        RF_Textures:UpdatePowerColor(frame)
    end)
end

function RF_Textures:OnDisable()
    RF_Textures:UnhookAll()
end
