--[[
Author: Jarth
Filename: CBs_Button.lua
]] --
-------------------------------------------------------------------------------------------------
-- VARIABLES --
-------------------------------------------------------------------------------------------------
local base = CollectionBars
local texts = base.Texts

-------------------------------------------------------------------------------------------------
-- FUNCTIONS --
-------------------------------------------------------------------------------------------------
CBs_Button = ZO_Object:Subclass()

function CBs_Button:New(categoryId, frame, cId)
    base:Verbose("CBs_Button:New", categoryId, frame, cId)
    local newB = ZO_Object.New(self)
    local category = base.Categories[categoryId]
    local collectible = category.Collection[cId]

    if newB then
        local ctrl = CreateControlFromVirtual(string.format(texts.FormatCategoryName, category.Id), frame, string.format(texts.FormatAbbreviationLowDash, "Button"), string.format("_B%s", cId))
        newB.cId = cId
        newB.categoryId = categoryId
        newB.ctrl = ctrl
        newB.ctrl.cId = cId
        newB.button = ctrl:GetNamedChild("Button")
        newB.button:SetId(cId)
        newB.button.tooltip = collectible.Name
        newB.enabledTexture = collectible.EnabledTexture
        newB.button.CBs = true
        newB.icon = ctrl:GetNamedChild("Icon")
        newB.cooldownIcon = ctrl:GetNamedChild("CooldownIcon")
        newB.cooldownTime = ctrl:GetNamedChild("CooldownTime")
        newB.buttonText = ctrl:GetNamedChild("ButtonText")
        newB.cooldown = ctrl:GetNamedChild("Cooldown")
        newB.cooldownCompleteAnim = ctrl:GetNamedChild("CooldownCompleteAnimation")
        newB.status = ctrl:GetNamedChild("Status")
        newB.inCooldown = false
        newB.showingCooldown = false
        newB.playSounds = false
    end

    return newB
end

function CBs_Button:UpdateAnchor(frame, left, top)
    base:Verbose("CBs_Button:UpdateAnchor", frame, left, top)
    self.ctrl:ClearAnchors()
    self.ctrl:SetAnchor(TOPLEFT, frame, TOPLEFT, left, top)
end

function CBs_Button:Setup()
    base:Verbose("CBs_Button:Setup")
    self.ctrl:SetHidden(false)
    self.icon:SetTexture(self.enabledTexture)
    self.icon:SetHidden(false)

    if self.cooldownIcon ~= nil then
        self.cooldownIcon:SetTexture(self.enabledTexture)
        self.cooldownIcon:SetDesaturation(1)
    end

    self.button:SetHandler("OnClicked", function() base:Activate(self) end)
    self.button:SetHandler("OnMouseEnter", function()
        if self.playSounds then PlaySound(SOUNDS.QUICKSLOT_MOUSEOVER) end
        local saved = base.Saved.Categories[self.categoryId]
        if saved.Tooltip.Show then ZO_Tooltips_ShowTextTooltip(self.button, saved.Tooltip.Position, self.button.tooltip) end
    end)
    self.button:SetHandler("OnMouseExit", function() ZO_Tooltips_HideTextTooltip() end)
end

function CBs_Button:SetShowBindingText(visible)
    base:Verbose("CBs_Button:SetShowBindingText", visible)
    self.buttonText:SetHidden(not visible)
end

function CBs_Button:SetSize(size)
    base:Verbose("CBs_Button:SetSize", size)
    self.ctrl:SetHeight(size)
    self.ctrl:SetWidth(size)
    self.icon:SetHeight(size - 6)
    self.icon:SetWidth(size - 6)
end

function CBs_Button:SetBindingText(show, cId)
    base:Verbose("CBs_Button:SetBindingText", show, cId)
    local keyId = base.Global.ReverseBindings[cId]
    if self.buttonText ~= nil then
        ZO_Keybindings_UnregisterLabelForBindingUpdate(self.buttonText)
        self.buttonText:ClearAnchors()
        self.buttonText:SetText("")
        if keyId ~= nil and show then
            self.buttonText:SetHeight(self.ctrl:GetHeight())
            self.buttonText:SetWidth(self.ctrl:GetWidth())
            self.buttonText:SetAnchor(BOTTOM, self.ctrl, BOTTOM, 0, 0)
            ZO_Keybindings_RegisterLabelForBindingUpdate(self.buttonText, string.format(texts.FormatAbbreviationLowDash, keyId), false)
        end
    end
end

function CBs_Button:OnClicked()
    base:Verbose("CBs_Button:OnClicked")
    if self.usable then UseCollectible(self.cId) end
end

function CBs_Button:UpdateState(forceId, isAttempting, isActiveActivationEnabled)
    base:Verbose("CBs_Button:UpdateState", forceId, isAttempting)
    local show = false
    if isActiveActivationEnabled then show = self.cId == forceId and isAttempting or not forceId and IsCollectibleActive(self.cId) end
    self.status:SetHidden(show == false)
end

function CBs_Button:UpdateUsable()
    base:Verbose("CBs_Button:UpdateUsable")
    local isShowingCooldown = self.showingCooldown
    local usable = false
    if not isShowingCooldown then usable = true end

    if usable ~= self.usable then self.usable = usable end
end

function CBs_Button:RefreshCooldown(remaining, duration, cooldown)
    base:Verbose("CBs_Button:RefreshCooldown", remaining, duration, cooldown)
    local percentComplete = (1 - remaining / duration)

    self.icon.percentComplete = percentComplete
    self.cooldownTime:SetText(cooldown)
end

function CBs_Button:UpdatePlaySounds(playSounds)
    base:Verbose("CBs_Button:UpdatePlaySounds", playSounds)
    self.playSounds = playSounds
end

function CBs_Button:UpdateCooldown(remaining, duration, cooldown)
    base:Verbose("CBs_Button:UpdateCooldown", remaining, duration, cooldown)
    local showCooldown = duration > 0

    self.cooldown:SetHidden(not showCooldown)
    self.cooldownTime:SetHidden(not showCooldown)

    if showCooldown then
        self.cooldown:StartCooldown(remaining, duration, CD_TYPE_RADIAL, nil, NO_LEADING_EDGE)
        if self.cooldownCompleteAnim.animation then self.cooldownCompleteAnim.animation:GetTimeline():PlayInstantlyToStart() end
        self.cooldown:SetHidden(false)
        self.ctrl:SetHandler("OnUpdate", function() self:RefreshCooldown(remaining, duration, cooldown) end)
    else
        if self.showingCooldown then
            if self.playSounds then PlaySound(SOUNDS.ABILITY_READY) end

            self.cooldownCompleteAnim.animation = self.cooldownCompleteAnim.animation or CreateSimpleAnimation(ANIMATION_TEXTURE, self.cooldownCompleteAnim)
            self.cooldownCompleteAnim:SetHidden(false)
            self.cooldown:SetHidden(false)

            self.cooldownCompleteAnim.animation:SetImageData(16, 1)
            self.cooldownCompleteAnim.animation:SetFramerate(30)
            self.cooldownCompleteAnim.animation:GetTimeline():PlayFromStart()
        end

        self.icon.percentComplete = 1
        self.ctrl:SetHandler("OnUpdate", nil)
        self.cooldown:ResetCooldown()
    end

    if showCooldown ~= self.showingCooldown then
        self.showingCooldown = showCooldown

        if self.showingCooldown then
            ZO_ContextualActionBar_AddReference()
        else
            ZO_ContextualActionBar_RemoveReference()
        end
    end

    local textColor = showCooldown and INTERFACE_TEXT_COLOR_FAILED or INTERFACE_TEXT_COLOR_SELECTED
    self.buttonText:SetColor(GetInterfaceColor(INTERFACE_COLOR_TYPE_TEXT_COLORS, textColor))

    self:UpdateUsable()
end

function CBs_Button:SetHidden(value)
    base:Verbose("CBs_Button:SetHidden", value)
    self.ctrl:SetHidden(value)
end

function CBs_Button:IsHidden()
    base:Verbose("CBs_Button:IsHidden")
    local isHidden = self.ctrl:IsHidden()
    return isHidden
end