-- @docclass
UICreatureButton = extends(UIWidget)

local CreatureButtonColors = {
  onIdle = {notHovered = '#888888', hovered = '#FFFFFF' },
  onTargeted = {notHovered = '#FF0000', hovered = '#FF8888' },
  onFollowed = {notHovered = '#00FF00', hovered = '#88FF88' }
}

local LifeBarColors = {} -- Must be sorted by percentAbove
table.insert(LifeBarColors, {percentAbove = 92, color = '#00BC00' } )
table.insert(LifeBarColors, {percentAbove = 60, color = '#50A150' } )
table.insert(LifeBarColors, {percentAbove = 30, color = '#A1A100' } )
table.insert(LifeBarColors, {percentAbove = 8, color = '#BF0A0A' } )
table.insert(LifeBarColors, {percentAbove = 3, color = '#910F0F' } )
table.insert(LifeBarColors, {percentAbove = -1, color = '#850C0C' } )

function UICreatureButton.create()
  local button = UICreatureButton.internalCreate()
  button:setFocusable(false)
  button.creature = nil
  button.isHovered = false
  button.isTarget = false
  button.isFollowed = false
  return button
end

function UICreatureButton:getClassName()
  return 'UICreatureButton'
end

function UICreatureButton:setCreature(creature)
    self.creature = creature
end

function UICreatureButton:getCreature()
  return self.creature
end

function UICreatureButton:getCreatureId()
    return self.creature:getId()
end

function UICreatureButton:setup(creature)
  self.creature = creature
  
  local creatureWidget = self:getChildById('creature')
  local labelWidget = self:getChildById('label')
  local lifeBarWidget = self:getChildById('lifeBar')
  
  labelWidget:setText(creature:getName())
  creatureWidget:setCreature(creature)
  
  self:setId('CreatureButton_' .. creature:getName():gsub('%s','_'))
  self:setLifeBarPercent(creature:getHealthPercent())
  
  self:updateSkull(creature:getSkull())
  self:updateEmblem(creature:getEmblem())
end

function UICreatureButton:update()
  local color = CreatureButtonColors.onIdle
  if self.isTarget then
    color = CreatureButtonColors.onTargeted
  elseif self.isFollowed then
    color = CreatureButtonColors.onFollowed
  end
  color = self.isHovered and color.hovered or color.notHovered

  if self.isHovered or self.isTarget or self.isFollowed then
    self.creature:showStaticSquare(color)
    self:getChildById('creature'):setBorderWidth(1)
    self:getChildById('creature'):setBorderColor(color)
    self:getChildById('label'):setColor(color)
  else
    self.creature:hideStaticSquare()
    self:getChildById('creature'):setBorderWidth(0)
    self:getChildById('label'):setColor(color)
  end
end

function UICreatureButton:updateSkull(skullId)
  if not self.creature then
    return
  end
  local skullId = skullId or self.creature:getSkull()
  local skullWidget = self:getChildById('skull')
  local labelWidget = self:getChildById('label')

  if skullId ~= SkullNone then
    skullWidget:setWidth(skullWidget:getHeight())
    local imagePath = getSkullImagePath(skullId)
    skullWidget:setImageSource(imagePath)
    labelWidget:setMarginLeft(5)
  else
    skullWidget:setWidth(0)
    if self.creature:getEmblem() == EmblemNone then
      labelWidget:setMarginLeft(2)
    end
  end
end

function UICreatureButton:updateEmblem(emblemId)
  if not self.creature then
    return
  end
  local emblemId = emblemId or self.creature:getEmblem()
  local emblemWidget = self:getChildById('emblem')
  local labelWidget = self:getChildById('label')

  if emblemId ~= EmblemNone then
    emblemWidget:setWidth(emblemWidget:getHeight())
    local imagePath = getEmblemImagePath(emblemId)
    emblemWidget:setImageSource(imagePath)
    emblemWidget:setMarginLeft(5)
    labelWidget:setMarginLeft(5)
  else
    emblemWidget:setWidth(0)
    emblemWidget:setMarginLeft(0)
    if self.creature:getSkull() == SkullNone then
      labelWidget:setMarginLeft(2)
    end
  end
end

function UICreatureButton:setLifeBarPercent(percent)
  local lifeBarWidget = self:getChildById('lifeBar')
  lifeBarWidget:setPercent(percent)

  local color
  for i, v in pairs(LifeBarColors) do
    if percent > v.percentAbove then
      color = v.color
      break
    end
  end

  lifeBarWidget:setBackgroundColor(color)
end