
local addonId, edTable = ...
local Details = _G._detalhes
local AceLocale = LibStub("AceLocale-3.0")
local Loc = AceLocale:GetLocale("Details_EncounterDetails")
local Graphics = LibStub:GetLibrary("LibGraph-2.0")
local ipairs = ipairs
local _GetSpellInfo = Details.getspellinfo
local unpack = unpack
local detailsFramework = DetailsFramework
local CreateFrame = CreateFrame
local GameCooltip = GameCooltip
local wipe = table.wipe
local _

--VerticalLines são os indicatores de onde aconteceram mortes, precisa ser renomeados e criar uma classe pra eles
--precisa fazer um indicator genérico na classe df_chart para ser usado como indicador de bloodlust ou qualquer coisa que indica um evento por x tempo

---@class ed_phaseframe : frame
---@field texture texture

local encounterDetails = _G.EncounterDetailsGlobal
local edFrame = encounterDetails.Frame

--an auxiliary table to store things related to df_chartmulti but can't be stored in 'chartPanel'
encounterDetails.chartFrameAux = {}

local CONST_CHART_WIDTH = 921
local CONST_CHART_HEIGHT = 524
local CONST_CHART_LENGTH = 810
local CONST_CHART_TIMELINE_Y_POSITION = -540
local CONST_CHART_MAX_DEATHS_ICONS = 6

local CONST_PHASE_PANEL_WIDTH = 451
local CONST_PHASE_BAR_HEIGHT = 16

local DETAILS_ATTRIBUTE_DAMAGE = 1

local phaseAlpha = 0.5
local lastBoss = nil
local chartLineColors = {{1, 1, 1, 1}, {1, 0.5, 0.3, 1}, {0.75, 0.7, 0.1, 1}, {0.2, 0.9, 0.2, 1}, {0.2, 0.5, 0.9, 1}}
encounterDetails.CombatsAlreadyDrew = {}

---create a multi chart frame
---@return df_chartmulti
local createMultiChartFrame = function()
    ---@type df_chartmulti
    local chartPanel = detailsFramework:CreateGraphicMultiLineFrame(edFrame, "EncounterDetailsChartPanel")
    chartPanel.xAxisLabelsYOffset = -9
    chartPanel:CreateAxesLines(48, 28, "left", 1, 10, 10, 1, 1, 1, 1)
    chartPanel:SetXAxisDataType("time")
    chartPanel:SetSize(CONST_CHART_WIDTH, CONST_CHART_HEIGHT)
    chartPanel:SetPoint("topleft", encounterDetails.Frame, "topleft", 2, -76)
    chartPanel:SetLineThickness(3)
    encounterDetails.chartPanel = chartPanel

    detailsFramework:ApplyStandardBackdrop(chartPanel)

    ---@type ed_phaseframe[]
    encounterDetails.chartFrameAux.PhaseFrames = {}
    encounterDetails.chartFrameAux.VerticalLines = {}

    local phaseTooltip = encounterDetails:CreatePhaseTooltip(chartPanel)
    encounterDetails:CreatePhaseIndicators(chartPanel, phaseTooltip)

    detailsFramework:NewLabel(chartPanel, chartPanel, nil, "phases_string", "phases:", "GameFontHighlightSmall")
    chartPanel["phases_string"]:SetPoint("bottomleft", chartPanel, "bottomleft", 5, 10)

    chartPanel:SetScript("OnShow", function()
        chartPanel["phases_string"]:Show()
    end)

    chartPanel:SetScript("OnHide", function()
        chartPanel["phases_string"]:Hide()
    end)

    return chartPanel
end

function encounterDetails:ShowChartFrame()
    local segment = encounterDetails._segment
    if (not segment) then
        return
    end

    ---@type df_chartmulti
    local multiChartPanel = encounterDetails.chartPanel

    if (not multiChartPanel) then
        ---@type df_chartmulti
        multiChartPanel = createMultiChartFrame()
    end
    multiChartPanel:Reset()

    ---@type combat
    local combatObject = encounterDetails:GetCombat(segment)
    --elapsed combat time
    if (combatObject:GetCombatTime() < 12) then
        return
    end

    local uniqueCombatId = combatObject:GetCombatUID()
    local chartData = EncounterDetailsDB.chartData[uniqueCombatId]
    local currentChartData = chartData and chartData["Raid Damage Done"]

    if (not currentChartData or not combatObject.start_time or not combatObject.end_time) then
        encounterDetails:Msg("This segment doesn't have chart data.")
        return

    elseif (currentChartData.max_value and currentChartData.max_value == 0) then
        return
    end

    encounterDetails.Frame.linhas = 1 --can't find references to this variable
    if (encounterDetails.Frame.linhas > 5) then
        encounterDetails.Frame.linhas = 1
    end

    for _, line in ipairs(encounterDetails.chartFrameAux.VerticalLines) do
        line:Hide()
    end

    local encounterId = combatObject.is_boss and combatObject.is_boss.id
    local chartIndex = 2
    local smoothnessLevel = 3

    ---draw the damage line from the 5th combat to 2nd combat
    for i = segment + 4, segment + 1, -1 do
        ---@type combat
        local thisCombatObject = encounterDetails:GetCombat(i)
        if (thisCombatObject) then
            local elapsedTime = thisCombatObject:GetCombatTime()
            if (elapsedTime > 12 and thisCombatObject.is_boss and thisCombatObject.is_boss.id == encounterId) then --is the same boss
                local thisUniqueCombatId = thisCombatObject:GetCombatUID()
                local thisChartData = EncounterDetailsDB.chartData[thisUniqueCombatId] and EncounterDetailsDB.chartData[thisUniqueCombatId]["Raid Damage Done"]

                --check if this is a valid chart data
                if (thisChartData and thisChartData.max_value and thisChartData.max_value > 0) then
                    local tryNumber = thisCombatObject.is_boss.try_number or i
                    multiChartPanel:AddData(thisChartData, smoothnessLevel, "Try #" .. tryNumber, chartLineColors[chartIndex])
                    multiChartPanel:SetXAxisData(elapsedTime)
                    chartIndex = chartIndex + 1
                end
            end
        end
    end

    ---@type number[]
    local bloodLustTimers = combatObject.bloodlust or {}

    for index, bloodlustCombatTime in ipairs(bloodLustTimers) do
        multiChartPanel:AddBackdropIndicator("Bloodlust #" .. index, bloodlustCombatTime, bloodlustCombatTime + 40, {0, 0, 1, 0.2})
    end

    encounterDetails:UpdatePhaseIndicators(multiChartPanel, combatObject)

    multiChartPanel:AddData(currentChartData, smoothnessLevel, "current", chartLineColors[1])
    multiChartPanel:SetXAxisData(combatObject:GetCombatTime())
    multiChartPanel:Plot()
    multiChartPanel:Show()
end


function encounterDetails:UpdatePhaseIndicators(chartPanel, combatObject)
    encounterDetails:ClearPhaseIndicators()

    --update phase indicators
    local phaseData = combatObject.PhaseData
    local plotFrameWidth = chartPanel.plotFrame:GetWidth()
    local scale = (plotFrameWidth) / combatObject:GetCombatTime()

    for i = 1, #phaseData do
        local phase = phaseData[i][1]
        local phaseStartAt = phaseData[i][2]
        local phaseIndicator = encounterDetails:GetPhaseIndicator(i, phase)

        if (phaseStartAt == 1) then
            phaseStartAt = 0
        end

        phaseIndicator:SetPoint("topleft", chartPanel.plotFrame, "bottomleft", (phaseStartAt * scale), -6)
        phaseIndicator.phase = phase
        phaseIndicator.start_at = phaseStartAt

        local nextPhase = phaseData[i+1]
        if (nextPhase) then
            local duration = nextPhase[2] - phaseStartAt
            phaseIndicator:SetWidth(scale * duration)
            phaseIndicator.elapsed = duration
        else
            local duration = combatObject:GetCombatTime() - phaseStartAt
            phaseIndicator:SetWidth(scale * duration)
            phaseIndicator.elapsed = duration
        end
    end
end

---tooltip frame on hovering over
---@param chartPanel df_chartmulti
---@return frame
function encounterDetails:CreatePhaseTooltip(chartPanel)
    ---@type frame
    local phaseTooltip = CreateFrame("frame", "EncounterDetailsPhasePanel", chartPanel, "BackdropTemplate")
    phaseTooltip:SetFrameStrata("TOOLTIP")
    phaseTooltip:SetFrameLevel(1000)
    phaseTooltip:SetWidth(450)
    detailsFramework:ApplyStandardBackdrop(phaseTooltip)

    local damageTexture = detailsFramework:CreateImage(phaseTooltip,[[Interface\AddOns\Details\images\skins\classic_skin_v1]], 16, 16, "overlay", {11/1024, 24/1024, 376/1024, 390/1024})
    local damageLabel = detailsFramework:CreateLabel(phaseTooltip, "Damage Done:")
    damageTexture:SetPoint("topleft", phaseTooltip, "topleft", 10, -10)
    damageLabel:SetPoint("left", damageTexture, "right", 4, 0)

    local healingTexture = detailsFramework:CreateImage(phaseTooltip,[[Interface\AddOns\Details\images\skins\classic_skin_v1]], 16, 16, "overlay", {43/1024, 57/1024, 376/1024, 390/1024})
    local healingLabel = detailsFramework:CreateLabel(phaseTooltip, "Healing Done:")
    healingTexture:SetPoint("topleft", phaseTooltip, "topleft", 250, -10)
    healingLabel:SetPoint("left", healingTexture, "right", 4, 0)

    phaseTooltip.phase_label = detailsFramework:CreateLabel(phaseTooltip, "")
    phaseTooltip.phase_label.fontsize = 10
    phaseTooltip.time_label = detailsFramework:CreateLabel(phaseTooltip, "")
    phaseTooltip.time_label.fontsize = 10
    phaseTooltip.report_label = detailsFramework:CreateLabel(phaseTooltip, "|cFFffb400Left Click|r: Report Damage |cFFffb400Right Click|r: Report Heal")
    phaseTooltip.report_label.fontsize = 10

    phaseTooltip.phase_label:SetPoint("bottomleft", phaseTooltip, "bottomleft", 10, 5)
    phaseTooltip.time_label:SetPoint("left", phaseTooltip.phase_label, "right", 5, 0)
    phaseTooltip.report_label:SetPoint("bottomright", phaseTooltip, "bottomright", -10, 5)

    local phaseFrameBackgroundTexture = detailsFramework:CreateImage(phaseTooltip,[[Interface\Tooltips\UI-Tooltip-Background]], nil, nil, "artwork")
    phaseFrameBackgroundTexture:SetPoint("left", phaseTooltip.phase_label, "left")
    phaseFrameBackgroundTexture.height = 16
    phaseFrameBackgroundTexture:SetPoint("right", phaseTooltip.report_label, "right")
    phaseFrameBackgroundTexture:SetVertexColor(0, 0, 0, 1)

    phaseTooltip.damage_labels = {}
    phaseTooltip.heal_labels = {}

    function phaseTooltip:ClearLabels()
        for i, tooltipBar in ipairs(phaseTooltip.damage_labels) do
            tooltipBar:Hide()
        end
        for i, tooltipBar in ipairs(phaseTooltip.heal_labels) do
            tooltipBar:Hide()
        end
    end

    local createTooltipBar = function(index, xOffset)
        ---@type statusbar
        local newtooltipBar = CreateFrame("statusbar", nil, phaseTooltip, "BackdropTemplate")
        newtooltipBar:SetSize(200, 16)
        newtooltipBar:SetFrameLevel(phaseTooltip:GetFrameLevel() + 50 - index)
        newtooltipBar:SetMinMaxValues(0, 1)
        newtooltipBar:SetPoint("topleft", phaseTooltip, "topleft", 5 + xOffset, ((index * 16) * -1) - 30)

        local playerName = detailsFramework:CreateLabel(newtooltipBar, "", 11, "white", nil, nil, nil, "overlay")

        local amountLabel = detailsFramework:CreateLabel(newtooltipBar, "", 11, nil, nil, nil, nil, "overlay")
        amountLabel:SetJustifyH("right")

        local iconTexture = detailsFramework:CreateImage(newtooltipBar, "", 16, 16, "overlay")

        local backgroundTexture = detailsFramework:CreateImage(newtooltipBar, [[Interface\AddOns\Details\images\bar_serenity]], nil, nil, "border")
        backgroundTexture.height = 16
        backgroundTexture:SetVertexColor(.1, .1, .1, 0.834)

        local statusBarTexture = newtooltipBar:CreateTexture(nil, "artwork")
        statusBarTexture:SetTexture([[Interface\AddOns\Details\images\bar_serenity]])
        statusBarTexture:SetVertexColor(.3, .3, .3, 1)
        statusBarTexture:SetAllPoints()
        newtooltipBar:SetStatusBarTexture(statusBarTexture)

        backgroundTexture:SetAllPoints()
        iconTexture:SetPoint("left", newtooltipBar, "left", 0, 0)
        playerName:SetPoint("left", iconTexture, "right", 2, 0)
        amountLabel:SetPoint("right", newtooltipBar, "right", -2, 0)

        newtooltipBar.lefttext = playerName
        newtooltipBar.righttext = amountLabel
        newtooltipBar.icon = iconTexture
        newtooltipBar.bg = backgroundTexture
        newtooltipBar.statusBarTexture = statusBarTexture

        return newtooltipBar
    end

    function phaseTooltip:GetTooltipBar(index, barType)
        local thisBar

        if (barType == "damage") then
            thisBar = phaseTooltip.damage_labels[index]
            if (not thisBar) then
                thisBar = createTooltipBar(index, 0)
                phaseTooltip.damage_labels[index] = thisBar
            end

        elseif (barType == "healing") then
            thisBar = phaseTooltip.heal_labels[index]
            if (not thisBar) then
                thisBar = createTooltipBar(index, 235)
                phaseTooltip.heal_labels[index] = thisBar
            end
        end

        thisBar:Show()
        return thisBar
    end

    return phaseTooltip
end

---phase indicators below the x axis
---@param chartPanel df_chartmulti
function encounterDetails:CreatePhaseIndicators(chartPanel, phaseTooltip)
    local sparkContainer = {}
    local phaseColors = {{0.2, 1, 0.2, phaseAlpha}, {1, 1, 0.2, phaseAlpha}, {1, 0.2, 0.2, phaseAlpha}, {0.2, 1, 1, phaseAlpha}, {0.2, 0.2, 1, phaseAlpha},
    [1.5] = {0.25, 0.95, 0.25, phaseAlpha},[2.5] = {0.95, 0.95, 0.25, phaseAlpha},[3.5] = {0.95, 0.25, 0.25, phaseAlpha}
    }

    local createSpark = function()
        local newSpark = phaseTooltip:CreateTexture(nil, "overlay")
        newSpark:SetTexture([[Interface\CastingBar\UI-CastingBar-Spark]])
        newSpark:SetBlendMode("ADD")
        newSpark:Hide()
        table.insert(sparkContainer, newSpark)
    end

    local getSpark = function(index)
        local spark = sparkContainer[index]
        if (not spark) then
            createSpark()
            spark = sparkContainer[index]
        end
        spark:ClearAllPoints()
        return spark
    end

    local hideSparks = function()
        for _, spark in ipairs(sparkContainer) do
            spark:Hide()
        end
    end

    local onClickPhase = function(self, button)
        ---@type combat
        local combatObject = encounterDetails:GetCombat(encounterDetails._segment)

        if (button == "LeftButton") then
            local result = {}
            local reportFunc = function(IsCurrent, IsReverse, AmtLines)
                AmtLines = AmtLines + 1
                if (#result > AmtLines) then
                    for i = #result, AmtLines+1, -1 do
                        table.remove(result, i)
                    end
                end
                encounterDetails:SendReportLines(result)
            end

            --need to build here because the mouse will leave the block to click in the send button
            table.insert(result, "Details!: Damage for Phase " .. self.phase .. " of " .. (combatObject and combatObject.is_boss and combatObject.is_boss.name or "Unknown") .. ":")
            for i = 1, #self.damage_actors do
                table.insert(result, encounterDetails:GetOnlyName(self.damage_actors[i][1]) .. ": " .. Details:ToK(math.floor(self.damage_actors[i][2])))
            end
            encounterDetails:SendReportWindow(reportFunc, nil, nil, true)

        elseif (button == "RightButton") then
            local result = {}
            local reportFunc = function(IsCurrent, IsReverse, AmtLines)
                AmtLines = AmtLines + 1
                if (#result > AmtLines) then
                    for i = #result, AmtLines+1, -1 do
                        table.remove(result, i)
                    end
                end
                encounterDetails:SendReportLines(result)
            end

            table.insert(result, "Details!: Healing for Phase " .. self.phase .. " of " ..(combatObject and combatObject.is_boss and combatObject.is_boss.name or "Unknown") .. ":")
            for i = 1, #self.heal_actors do
                table.insert(result, encounterDetails:GetOnlyName(self.heal_actors[i][1]) .. ": " .. Details:ToK(math.floor(self.heal_actors[i][2])))
            end
            encounterDetails:SendReportWindow(reportFunc, nil, nil, true)
        end
    end

    local onEnterPhase = function(self)
        local leftSpark = getSpark(1)
        local rightSpark = getSpark(2)
        leftSpark:SetPoint("left", self.texture, "left", -16, 0)
        rightSpark:SetPoint("right", self.texture, "right", 16, 0)
        leftSpark:Show()
        rightSpark:Show()
        self.texture:SetBlendMode("ADD")

        local phase = self.phase
        local sparkIndex = 3

        self.texture:SetVertexColor(1, 1, 1)

        for _, thisPhaseFrame in ipairs(encounterDetails.chartFrameAux.PhaseFrames) do
            if (thisPhaseFrame ~= self and thisPhaseFrame.phase == phase) then
                local thisPhaseLeftSpark = getSpark(sparkIndex)
                local thisPhaseRightSpark = getSpark(sparkIndex+1)
                thisPhaseLeftSpark:SetPoint("left", thisPhaseFrame.texture, "left", -16, 0)
                thisPhaseRightSpark:SetPoint("right", thisPhaseFrame.texture, "right", 16, 0)
                thisPhaseLeftSpark:Show()
                thisPhaseRightSpark:Show()
                thisPhaseFrame.texture:SetBlendMode("ADD")
                thisPhaseFrame.texture:SetVertexColor(1, 1, 1)
                sparkIndex = sparkIndex + 2
            end
        end

        ---@type combat
        local combatObject = encounterDetails:GetCombat(encounterDetails._segment)

        if (combatObject) then
            phaseTooltip:ClearLabels()

            --damage
            ---@type table<number, table<string, number>>
            local listOfPlayers = {}
            for playerName, damageDone in pairs(combatObject.PhaseData.damage[self.phase]) do
                table.insert(listOfPlayers, {playerName, damageDone})
            end
            table.sort(listOfPlayers, Details.Sort2)
            local topDamage = listOfPlayers[1] and listOfPlayers[1][2]

            for index, playerTable in ipairs(listOfPlayers) do
                local playerName = playerTable[1]
                local damageDone = playerTable[2]

                local tooltipBar = phaseTooltip:GetTooltipBar(index, "damage")
                tooltipBar:SetValue(damageDone / topDamage)

                tooltipBar.lefttext.text = encounterDetails:GetOnlyName(playerName)
                tooltipBar.righttext.text = Details:ToK(math.floor(damageDone))

                ---@type actor
                local actor = combatObject:GetActor(DETAILS_ATTRIBUTE_DAMAGE, playerName)

                local class = encounterDetails:GetClass(playerName)
                local spec = encounterDetails:GetSpec(playerName) or actor and actor.spec

                --get the class color for the actor
                local red, green, blue = Details:GetClassColor(class)
                tooltipBar:SetStatusBarColor(red, green, blue)

                if (spec) then
                    tooltipBar.icon.texture = [[Interface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES-SPECSl]]
                    tooltipBar.icon.texcoord = encounterDetails.class_specs_coords[spec]

                elseif (class) then
                    tooltipBar.icon.texture = [[Interface\AddOns\Details\images\classes_small_alpha]]
                    tooltipBar.icon.texcoord = Details.class_coords[class]

                else
                    tooltipBar.icon.texture = [[Interface\LFGFRAME\LFGROLE_BW]]
                    tooltipBar.icon:SetTexCoord(.25, .5, 0, 1)
                end

                tooltipBar:Show()
            end

            local damage_players = #listOfPlayers
            self.damage_actors = listOfPlayers

            --healing
            ---@type table<number, table<string, number>>
            local listOfPlayersHeal = {}
            for playerName, heal in pairs(combatObject.PhaseData.heal[self.phase]) do
                table.insert(listOfPlayersHeal, {playerName, heal})
            end
            table.sort(listOfPlayersHeal, Details.Sort2)
            local topHealing = listOfPlayersHeal[1] and listOfPlayersHeal[1][2]

            for index, playerTable in ipairs(listOfPlayersHeal) do
                local playerName = playerTable[1]
                local healingDone = playerTable[2]

                local tooltipBar = phaseTooltip:GetTooltipBar(index, "healing")
                tooltipBar:SetValue(healingDone / topHealing)

                tooltipBar.lefttext.text = encounterDetails:GetOnlyName(playerName)
                tooltipBar.righttext.text = Details:ToK(math.floor(healingDone))

                ---@type actor
                local actor = combatObject:GetActor(DETAILS_ATTRIBUTE_DAMAGE, playerName)

                local class = encounterDetails:GetClass(playerName)
                local spec = encounterDetails:GetSpec(playerName) or actor and actor.spec

                --get the class color for the actor
                local red, green, blue = Details:GetClassColor(class)
                tooltipBar:SetStatusBarColor(red, green, blue)

                if (spec) then
                    tooltipBar.icon.texture = [[Interface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES-SPECS]]
                    tooltipBar.icon.texcoord = encounterDetails.class_specs_coords[spec]

                elseif (class) then
                    tooltipBar.icon:SetTexture([[Interface\AddOns\Details\images\classes_small_alpha]])
                    tooltipBar.icon:SetTexCoord(unpack(Details.class_coords[class]))

                else
                    tooltipBar.icon:SetTexture([[Interface\LFGFRAME\LFGROLE_BW]])
                    tooltipBar.icon:SetTexCoord(.25, .5, 0, 1)
                end

                tooltipBar:Show()
            end

            local heal_players = #listOfPlayersHeal
            self.heal_actors = listOfPlayersHeal

            --show the panel
            phaseTooltip:SetHeight((math.max(damage_players, heal_players) * 16) + 60)
            phaseTooltip:SetPoint("bottom", self, "top", 0, 10)
            phaseTooltip:Show()

            phaseTooltip.phase_label.text = "|cFFffb400Phase|r: " .. self.phase

            local m, s = math.floor(self.elapsed / 60), math.floor(self.elapsed % 60)
            phaseTooltip.time_label.text = "|cFFffb400Elapsed|r: " .. m .. "m " .. s .. "s"
        end
    end

    local onLeavePhase = function(self)
        wipe(self.damage_actors)
        wipe(self.heal_actors)

        for _, phaseTextureFrame in ipairs(encounterDetails.chartFrameAux.PhaseFrames) do
            phaseTextureFrame.texture:SetBlendMode("BLEND")
            phaseTextureFrame.texture:SetVertexColor(unpack(phaseTextureFrame.texture.original_color))
        end

        hideSparks()
        phaseTooltip:Hide()
    end

    function encounterDetails:GetPhaseIndicator(index, phase)
        local phaseIndicatorFrame = encounterDetails.chartFrameAux.PhaseFrames[index]

        if (not phaseIndicatorFrame) then
            ---@type ed_phaseframe
            phaseIndicatorFrame = CreateFrame("frame", "EncounterDetailsPhaseTexture" .. index, chartPanel, "BackdropTemplate")
            phaseIndicatorFrame:SetHeight(CONST_PHASE_BAR_HEIGHT)

            local phaseTexture = phaseIndicatorFrame:CreateTexture(nil, "artwork")
            phaseTexture:SetAllPoints()
            phaseTexture:SetColorTexture(1, 1, 1, phaseAlpha)
            phaseTexture.original_color = {1, 1, 1}
            phaseIndicatorFrame.texture = phaseTexture

            phaseIndicatorFrame:SetScript("OnEnter", onEnterPhase)
            phaseIndicatorFrame:SetScript("OnLeave", onLeavePhase)
            phaseIndicatorFrame:SetScript("OnMouseUp", onClickPhase)

            phaseIndicatorFrame = phaseIndicatorFrame
            table.insert(encounterDetails.chartFrameAux.PhaseFrames, phaseIndicatorFrame)
        end

        phaseIndicatorFrame:ClearAllPoints()

        phase = math.min(phase, 5)
        if (not phaseColors[phase]) then
            Details:Msg("Phase out of range:", phase)
            phase = math.max(phase, 1)
        end

        local phaseColor = phaseColors[phase]
        if (not phaseColor) then
            phaseColor = {1, 1, 1}
        end

        phaseIndicatorFrame.texture:SetVertexColor(unpack(phaseColor))
        local originalColor = phaseIndicatorFrame.texture.original_color
        originalColor[1], originalColor[2], originalColor[3] = unpack(phaseColors[phase])

        phaseIndicatorFrame:Show()

        return phaseIndicatorFrame
    end

    function encounterDetails:ClearPhaseIndicators()
        for i, texture in pairs(encounterDetails.chartFrameAux.PhaseFrames) do
            texture:Hide()
        end
    end
end

---not in use at the moment
---@param self any
---@param chartPanel df_chart
---@param detailsGraphicData any
---@param combatObject combat
---@param drawDeathsCombat combat
function encounterDetails:DrawSegmentGraphic(chartPanel, detailsGraphicData, combatObject, drawDeathsCombat)

    --> add death icons for the first deaths in the segment
    if (drawDeathsCombat) then
        local mortes = drawDeathsCombat.last_events_tables
        local scaleG = CONST_CHART_LENGTH / drawDeathsCombat:GetCombatTime()

        for _, row in ipairs(encounterDetails.chartFrameAux.VerticalLines) do
            row:Hide()
        end

        for i = 1, math.min(CONST_CHART_MAX_DEATHS_ICONS, #mortes) do

            local vRowFrame = encounterDetails.chartFrameAux.VerticalLines[i]

            if (not vRowFrame) then
                vRowFrame = CreateFrame("frame", "DetailsEncountersVerticalLine"..i, chartPanel, "BackdropTemplate")
                vRowFrame:SetWidth(20)
                vRowFrame:SetHeight(43)
                vRowFrame:SetFrameLevel(chartPanel:GetFrameLevel()+2)

                vRowFrame:SetScript("OnEnter", function(frame)
                    if (vRowFrame.dead[1] and vRowFrame.dead[1][3] and vRowFrame.dead[1][3][2]) then
                        GameCooltip:Reset()

                        --time of death and player name
                        GameCooltip:AddLine(vRowFrame.dead[6].." "..vRowFrame.dead[3])
                        local class, l, r, t, b = Details:GetClass(vRowFrame.dead[3])
                        if (class) then
                            GameCooltip:AddIcon([[Interface\AddOns\Details\images\classes_small]], 1, 1, 12, 12, l, r, t, b)
                        end
                        GameCooltip:AddLine("")

                        --last hits:
                        local death = vRowFrame.dead
                        local amt = 0
                        for i = #death[1], 1, -1 do
                            local this_hit = death[1][i]
                            if (type(this_hit[1]) == "boolean" and this_hit[1]) then
                                local spellname, _, spellicon = _GetSpellInfo(this_hit[2])
                                local t = death[2] - this_hit[4]
                                GameCooltip:AddLine("-" .. string.format("%.1f", t) .. " " .. spellname .. "(" .. this_hit[6] .. ")", encounterDetails:comma_value(this_hit[3]))
                                GameCooltip:AddIcon(spellicon, 1, 1, 12, 12, 0.1, 0.9, 0.1, 0.9)
                                amt = amt + 1
                                if (amt == 3) then
                                    break
                                end
                            end
                        end

                        GameCooltip:SetOption("TextSize", 9.5)
                        GameCooltip:SetOption("HeightAnchorMod", -15)

                        GameCooltip:SetWallpaper(1,[[Interface\SPELLBOOK\Spellbook-Page-1]], {.6, 0.1, 0, 0.64453125}, {1, 1, 1, 0.1}, true)
                        GameCooltip:ShowCooltip(frame, "tooltip")
                    end
                end)

                vRowFrame:SetScript("OnLeave", function(frame)
                    Details.popup:ShowMe(false)
                end)

                vRowFrame.texture = vRowFrame:CreateTexture(nil, "overlay")
                vRowFrame.texture:SetTexture("Interface\\AddOns\\Details\\images\\verticalline")
                vRowFrame.texture:SetWidth(3)
                vRowFrame.texture:SetHeight(20)
                vRowFrame.texture:SetPoint("center", "DetailsEncountersVerticalLine"..i, "center")
                vRowFrame.texture:SetPoint("bottom", "DetailsEncountersVerticalLine"..i, "bottom", 0, 0)
                vRowFrame.texture:SetVertexColor(1, 1, 1, .5)

                vRowFrame.icon = vRowFrame:CreateTexture(nil, "overlay")
                vRowFrame.icon:SetTexture("Interface\\WorldStateFrame\\SkullBones")
                vRowFrame.icon:SetTexCoord(0.046875, 0.453125, 0.046875, 0.46875)
                vRowFrame.icon:SetWidth(16)
                vRowFrame.icon:SetHeight(16)
                vRowFrame.icon:SetPoint("center", "DetailsEncountersVerticalLine"..i, "center")
                vRowFrame.icon:SetPoint("bottom", "DetailsEncountersVerticalLine"..i, "bottom", 0, 20)

                encounterDetails.chartFrameAux.VerticalLines[i] = vRowFrame
            end

            local deadTime = mortes[i].dead_at
            vRowFrame:SetPoint("topleft", encounterDetails.Frame, "topleft",(deadTime*scaleG)+70, -CONST_CHART_HEIGHT-22)
            vRowFrame.dead = mortes[i]
            vRowFrame:Show()

        end
    end
end


function encounterDetails:CreateGraphPanel() --not in use
    --bloodlust indicators
    chartPanel.bloodlustIndicators = {}
    for i = 1, 5 do
        local bloodlustTexture = chartPanel:CreateTexture(nil, "overlay")
        bloodlustTexture:SetColorTexture(0, 1, 0, 0,6)
        chartPanel.bloodlustIndicators[#chartPanel.bloodlustIndicators+1] = bloodlustTexture
    end
end
