--!nonstrict
--[[
  Filename: StatsMiniTextPanel.lua
  Written by: dbanks
  Description: Panel that shows title and current value for a given stat.
--]]

--[[ Globals ]]--
local TitleHeightYFraction = 0.4
local ValueHeightYFraction = 0.3
local TitleTopYFraction = (1 - TitleHeightYFraction - 
  ValueHeightYFraction)/2
local LeftMarginPix = 10

local TitlePosition = UDim2.new(0, 
  LeftMarginPix, 
  TitleTopYFraction, 
  0)
local TitleSize = UDim2.new(1, 
  -LeftMarginPix * 2, 
  TitleHeightYFraction, 
  0)
local ValuePosition = UDim2.new(0,
  LeftMarginPix, 
  TitleTopYFraction + TitleHeightYFraction, 
  0)
local ValueSize = UDim2.new(1, 
  -LeftMarginPix * 2,
  ValueHeightYFraction, 
  0)

--[[ Services ]]--
local CoreGuiService = game:GetService('CoreGui')

--[[ Modules ]]--
local StatsUtils = require(CoreGuiService.RobloxGui.Modules.Stats.StatsUtils)
local StatsAggregatorClass = require(CoreGuiService.RobloxGui.Modules.Stats.StatsAggregator)

--[[ Classes ]]--
local StatsMiniTextPanelClass = {}
StatsMiniTextPanelClass.__index = StatsMiniTextPanelClass

function StatsMiniTextPanelClass.new(statType) 
  local self = {}
  setmetatable(self, StatsMiniTextPanelClass)

  self._statType = statType
  
  self._frame = Instance.new("Frame")
  self._frame.Name = "StatsMiniTextPanelClass"
  
  self._frame.BackgroundTransparency = 1.0
  self._frame.ZIndex = StatsUtils.TextZIndex
  
  self._titleLabel = Instance.new("TextLabel")
  self._titleLabel.Name = "TitleLabel"
  self._valueLabel = Instance.new("TextLabel")
  self._valueLabel.Name = "ValueLabel"

  StatsUtils.StyleTextWidget(self._titleLabel)
  StatsUtils.StyleTextWidget(self._valueLabel)
  
  self._titleLabel.FontSize = StatsUtils.MiniPanelTitleFontSize
  self._titleLabel.Text = self:_getTitle()
  self._titleLabel.Parent = self._frame
  self._titleLabel.Size = TitleSize
  self._titleLabel.Position = TitlePosition
  self._titleLabel.TextXAlignment = Enum.TextXAlignment.Left
  
  self._valueLabel.FontSize = StatsUtils.MiniPanelValueFontSize
  self._valueLabel.Text = "0"
  self._valueLabel.Parent = self._frame
  self._valueLabel.Size = ValueSize
  self._valueLabel.Position = ValuePosition
  self._valueLabel.TextXAlignment = Enum.TextXAlignment.Left
  
  return self
end

function StatsMiniTextPanelClass:SetZIndex(zIndex)
  self._frame.ZIndex = zIndex
  self._titleLabel.ZIndex = zIndex
  self.ZIndex = zIndex
end

function StatsMiniTextPanelClass:_getTitle()
  return StatsUtils.TypeToShortName[self._statType]
end

function StatsMiniTextPanelClass:PlaceInParent(parent, size, position) 
  self._frame.Position = position
  self._frame.Size = size
  self._frame.Parent = parent  
end

function StatsMiniTextPanelClass:SetStatsAggregator(aggregator)
  if (self._aggregator) then
    self._aggregator:RemoveListener(self._listenerId)
    self._listenerId = nil
    self._aggregator = nil
  end
  
  self._aggregator = aggregator
    
  self:_refreshVisibility()
end

function StatsMiniTextPanelClass:SetVisible(visible)
  self.frame.Visible = visible
  self:_refreshVisibility()
end

function StatsMiniTextPanelClass:_shouldBeVisible()
  if StatsUtils.PerformanceStatsShouldBeVisible() then 
    return self._frame.Visible
  else
    return false
  end
end


function StatsMiniTextPanelClass:_refreshVisibility()
  if self:_shouldBeVisible() then
    self:_startListening()
    self:_updateFromAggregator()
  else
    self:_stopListening()
  end
end

function StatsMiniTextPanelClass:_stopListening()
  if (self._aggregator == nil) then
    return
  end
  
  if (self._listenerId == nil) then 
    return
  end
  
  self._aggregator:RemoveListener(self._listenerId)
  self._listenerId = nil  
end

function StatsMiniTextPanelClass:_startListening()
  if (self._aggregator == nil) then
    return
  end
  
  if (self._listenerId ~= nil) then 
    return
  end
  
  self._listenerId = self._aggregator:AddListener(function()
      self:_updateFromAggregator()
  end)  
end

function StatsMiniTextPanelClass:OnPerformanceStatsShouldBeVisibleChanged()
  self:_refreshVisibility()
end

function StatsMiniTextPanelClass:_updateFromAggregator()
  local value
  
  if self._aggregator ~= nil then 
    value = self._aggregator:GetLatestValue()
  else
    value = 0
  end
  
  self._valueLabel.Text = StatsUtils.FormatTypedValue(value, self._statType)
end



return StatsMiniTextPanelClass