-- ========================================================================= --
--                              SylingTracker                                --
--           https://www.curseforge.com/wow/addons/sylingtracker             --
--                                                                           --
--                               Repository:                                 --
--                   https://github.com/Skamer/SylingTracker                 --
--                                                                           --
-- ========================================================================= --
Syling                      "SylingTracker.Torghast"                         ""
-- ========================================================================= --
import                              "SLT"
-- ========================================================================= --
_Active                             = false
-- ========================================================================= --
export {
  RegisterContentType               = API.RegisterContentType,
  RegisterModel                     = API.RegisterModel,

  IsInJailersTower                  = IsInJailersTower,
  GetJailersTowerLevel              = GetJailersTowerLevel,
  GetAnimaPowerRarity               = Utils.Torghast.GetAnimaPowerRarity,
  GetStepInfo                       = C_Scenario.GetStepInfo,
  GetScenarioWidgetInfo             = C_UIWidgetManager.GetScenarioHeaderCurrenciesAndBackgroundWidgetVisualizationInfo,
  GetStatusBarWidgetInfo            = C_UIWidgetManager.GetStatusBarWidgetVisualizationInfo,
  UnitAura                          = UnitAura
}
-- ========================================================================= --
local _TorghastModel                = RegisterModel(Model, "torghast-data")
-- ========================================================================= --
RegisterContentType({
  ID = "torghast",
  DisplayName = "Torghast",
  Description = "TORGHAST_PH_DESCRIPTION",
  DefaultOrder = 40,
  DefaultModel = _TorghastModel,
  DefaultViewClass = TorghastContentView,
  Events = "PLAYER_ENTERING_WORLD",
  Status = function() return IsInJailersTower() end 
})
-- ========================================================================= --
local TORGHAST_WIDGET_ID            = 2319
local TORGHAST_TARRAGRUE_WIDGET_ID  = 2321
local MAX_BUFF_MAX_DISPLAY          = 44
-- ========================================================================= --
__ActiveOnEvents__ "PLAYER_ENTERING_WORLD"
function BecomeActiveOn(self)
  return IsInJailersTower() 
end 
-- ========================================================================= --
function OnActive(self)
  self:UpdateDeathAndFantasmCurrency()
  self:UpdateAnimaPowers()
  self:UpdateLevel()
  self:UpdateObjectives()

  _TorghastModel:Flush()
end

function OnInactive(self)
  _TorghastModel:ClearData()
end
-- ========================================================================= --
__SystemEvent__()
function UPDATE_UI_WIDGET(widgetInfo)
  if widgetInfo.widgetID == TORGHAST_WIDGET_ID then 
    _M:UpdateDeathAndFantasmCurrency()
    _TorghastModel:Flush()
  elseif widgetInfo.widgetID == TORGHAST_TARRAGRUE_WIDGET_ID then 
    _M:UpdateTarragrueTimer()
    _TorghastModel:Flush()
  end 
end

__SystemEvent__()
function SCENARIO_UPDATE(isNewStage)
  if isNewStage then 
    _M:UpdateObjectives()
    _TorghastModel:Flush()
  end 
end

__SystemEvent__()
function JAILERS_TOWER_LEVEL_UPDATE(level, type)
  _TorghastModel:AddData({ level = level }, "torghast")
  _TorghastModel:Flush()
end

__SystemEvent__()
function UNIT_AURA(unit)
  if unit == "player" then 
    _M:UpdateAnimaPowers()
    _TorghastModel:Flush()
  end
end 
-- ========================================================================= --
function UpdateObjectives(self)
    local stageName, stageDescription, numObjectives = GetStepInfo()
    _TorghastModel:AddData({ stageName = stageName, stageDescription = stageDescription}, "torghast")
end

--- The death and the fantasm currency are provided by the Widget System and represented by
--- a ScenarioHeaderCurrenciesAndBackgroundWidgetVisualizationInfo
--- /dump C_UIWidgetManager.GetStatusBarWidgetVisualizationInfo(2319)
--- in Torghast for more information
function UpdateDeathAndFantasmCurrency(self)
  -- local widget = GetWidgetVisualizationInfo(TORGHAST_WIDGET_ID)
  -- GetScenarioHeaderCurrenciesAndBackgroundWidgetVisualizationInfo
  local info = GetScenarioWidgetInfo(TORGHAST_WIDGET_ID)

  if info then
    local data = {} 
    -- The first currency is the remaining death 
    local deathCurrency = info.currencies[1]
    data.remainingDeath = tonumber(deathCurrency.text)
    data.deathTooltip = deathCurrency.tooltip 

    -- The second currency is fantasm
    local fanstasmCurrency = info.currencies[2]
    data.fanstasm = tonumber(fanstasmCurrency.text)
    data.fanstasmTooltip = fanstasmCurrency.tooltip 

    -- The level text (is 100% correct)
    local levelText = info.headerText
    data.levelText = levelText

    _TorghastModel:AddData(data, "torghast")
  end 
end

--- The timer information is provided by the Widget system and represented by
--- a GetStatusBarWidgetVisualizationInfo
--- /dump C_UIWidgetManager.GetStatusBarWidgetVisualizationInfo(2321)
--- in Torghast for more information
function UpdateTarragrueTimer(self)
  -- local info = C_UIWidgetManager.GetStatusBarWidgetVisualizationInfo(TORGHAST_TARRAGRUE_WIDGET_ID)
  local info = GetStatusBarWidgetInfo(TORGHAST_TARRAGRUE_WIDGET_ID)
  local shownState = info.shownState 
  
  -- If the widget is shown, update the data
  if shownState == 1 then
    local data = {} 
    data.barMin    = info.barMin
    data.barValue  = info.barValue
    data.barMax    = info.barMax

    -- text = "Tarragrue arrives in:"
    data.text = info.text
    -- tooltip = "Get to the exist quickly!"
    data.tooltip = info.tooltip

    -- overrideBarText = "Hurry"
    -- This shows "Hurry" when the player has mouseover on the bar. 
    data.overrideBarText = info.overrideBarText

    _TorghastModel:AddData(data, "torghast", "tarragrue")
  else 
    _TorghastModel:RemoveData("torghast", "tarragrue")
  end 
end

function UpdateAnimaPowers(self)
  local data = {}
  local animaPowersData = {}
  local numAnimaPowers = 0
  for i = 1, MAX_BUFF_MAX_DISPLAY do 
    local _, icon, count, _, _, _, _, _, _, spellID = UnitAura("player", i, "MAW"); 
    if icon then
      if count == 0 then 
        count = 1
      end

      local rarity = GetAnimaPowerRarity(spellID)
      animaPowersData[spellID] = { icon = icon, spellID = spellID, count = count, rarity = rarity, slot = i }

      numAnimaPowers = numAnimaPowers + count
    end 
  end

  data.numAnimaPowers = numAnimaPowers
  data.animaPowers = animaPowersData
  
  _TorghastModel:AddData(data, "torghast")
end

function UpdateLevel(self)
  _TorghastModel:AddData({ level = GetJailersTowerLevel() }, "torghast")
end
-- ========================================================================= --
-- Debug Utils Tools
-- ========================================================================= --
if ViragDevTool_AddData then 
  ViragDevTool_AddData(_TorghastModel, "SLT Torghast Model")
end