local T = ShaguTweaks.T

local module = ShaguTweaks:register({
  title = T["Unit Frame Energy & Mana Tick"],
  description = T["Adds an energy & mana tick to the player frame."],
  expansions = { ["vanilla"] = true, ["tbc"] = nil },
  category = T["Unit Frames"],
  enabled = nil,
})

module.enable = function(self)
  local energytick = CreateFrame("Frame", nil, PlayerFrameManaBar)
  energytick:SetAllPoints(PlayerFrameManaBar)
  energytick:RegisterEvent("PLAYER_ENTERING_WORLD")
  energytick:RegisterEvent("UNIT_DISPLAYPOWER")
  energytick:RegisterEvent("UNIT_ENERGY")
  energytick:RegisterEvent("UNIT_MANA")
  energytick:SetScript("OnEvent", function()
    if UnitPowerType("player") == 0 then
      this.mode = "MANA"
      -- hide if full mana and not in combat
      if (UnitMana("player") == UnitManaMax("player")) and (not UnitAffectingCombat("player")) then
        this:Hide()
      else
        this:Show()
      end
    elseif UnitPowerType("player") == 3 then
      this.mode = "ENERGY"
      this:Show()
    else
      this:Hide()
    end

    if event == "PLAYER_ENTERING_WORLD" then
      this.lastMana = UnitMana("player")
    end

    if (this.mode == "ENERGY") or ((event == "UNIT_MANA" or event == "UNIT_ENERGY") and arg1 == "player") then
      this.currentMana = UnitMana("player")
      local diff = 0
      if this.lastMana then
        diff = this.currentMana - this.lastMana
      end

      if this.mode == "MANA" and diff < 0 then
        this.target = 5
      elseif this.mode == "MANA" and diff > 0 then
        if this.max ~= 5 and diff > (this.badtick and this.badtick*1.2 or 5) then
          this.target = 2
        else
          this.badtick = diff
        end
      elseif this.mode == "ENERGY" and diff >= 0 then
        this.target = 2
      end
      this.lastMana = this.currentMana
    end
  end)

local pheight, pwidth = PlayerFrameManaBar:GetHeight(), PlayerFrameManaBar:GetWidth()
energytick:SetScript("OnUpdate", function()
  if this.target then
    this.start, this.max = GetTime(), this.target
    this.target = nil
  end

  if not this.start then return end

  this.current = GetTime() - this.start

  if this.current > this.max then
    this.start, this.max, this.current = GetTime(), 2, 0
  end

  local pos = (pwidth ~= "-1" and pwidth or width) * (this.current / this.max)
  if not pheight then return end
  this.spark:SetPoint("LEFT", pos-((pheight+5)/2), 0)
end)

  energytick.spark = energytick:CreateTexture(nil, 'OVERLAY')
  energytick.spark:SetTexture("Interface\\CastingBar\\UI-CastingBar-Spark")
  energytick.spark:SetHeight(pheight + 10)
  energytick.spark:SetWidth(pheight + 4)
  energytick.spark:SetBlendMode('ADD')
end