--[[============================================================================
  This file is a part of ChampionBar

  Copyright (C) 2015 Scott Yeskie (Sasky)

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  ============================================================================]]

--[[============================================================================
  This file is a part of ChampionBar

  Copyright (C) 2015 Scott Yeskie (Sasky)

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  ============================================================================]]

--[[TODO: Fix animation at beginning
Old VPbar values get cached from the initial and show a levelup to the value.

Possible points to hit:
[line 661]
.pendingShowIncrease => Set in PPB:ShowIncrease

[line 687]
could be coming in through :RefreshCurrentBar -> :SetBarValue.
  - probably not able to hijack then restore, though

[line 773] => looks like the pendingShowIncrease is where it's coming in

[line 893] => :ClearIncreaseData() Could prevent it going into increase

Problem is a lot of the functions refer to local variables and/or self.
Overwriting with a new version might keep the self variable the same
]]--

EP_PER_CHAMPION_POINT = 100000
ENLIGHTENMENT_MAX = 1200000

ChampionBar = ChampionBar or {}

function ChampionBar.replaceBars()
    local ppb = PLAYER_PROGRESS_BAR
    ppb.barTypeClasses[PPB_CLASS_EP] = ChampionBar.EPBarType
    ppb.barTypeClasses[PPB_CLASS_VP] = ChampionBar.VPMaxBarType
    ppb.nextBarType = 1
    ppb.barTypes = {}

    PPB_XP = ppb:InstantiateBarType(PPB_CLASS_XP)
    PPB_VP = ppb:InstantiateBarType(PPB_CLASS_VP)
    PPB_CP = ppb:InstantiateBarType(PPB_CLASS_CP)
    PPB_EP = ppb:InstantiateBarType(PPB_CLASS_EP)
    ppb:RefreshCurrentBar()
end

function ChampionBar.replaceHandlers()
    function PLAYER_PROGRESS_BAR:RefreshSecondaryBar()
        local secondaryBarInfo = self:GetSecondaryBarInfo()
        if secondaryBarInfo then
            local current = secondaryBarInfo:GetCurrent()
            local max = secondaryBarInfo:GetLevelSize(secondaryBarInfo:GetLevel())
            if max == nil then
                current = 1
                max = 1
            end
            self.secondaryBarControl:SetMinMax(0, max)
            self.secondaryBarControl:SetValue(current)
            local gradient = secondaryBarInfo:GetBarGradient()
            ZO_StatusBar_SetGradientColor(self.secondaryBarControl, gradient)
            ZO_StatusBar_SetGradientColor(self.enlightenedBarControl, gradient)
            local icon = secondaryBarInfo:GetIcon()
            if icon then
                self.secondaryBarLevelTypeIcon:SetTexture(icon)
            end
            self.secondaryBarLevelTypeIcon:SetHidden(not icon)
            local txt = current == 0 and "" or "ENLIGHTENED"
            self.secondaryBarControl:GetNamedChild("SecondaryLevelType"):SetText(txt)
        end
        self.secondaryBarControl:SetHidden(secondaryBarInfo == nil)
    end
end

function ChampionBar.cpCurve(val, max)
    return math.sqrt(val)*math.sqrt(max)
end

function ChampionBar.registerEvents()
    EVENT_MANAGER:RegisterForEvent("ChampionBar",  EVENT_CHAMPION_POINT_GAINED, function()
        local vpbar = PLAYER_PROGRESS_BAR.barTypes[PPB_VP];
        vpbar.icon = vpbar:GetIcon()
        vpbar.barGradient = vpbar:GetBarGradient()
    end)
end

function ChampionBar.addLines()
    local parent = PLAYER_PROGRESS_BAR.secondaryBarControl
    local maxwidth = parent:GetWidth()
    local linecolor = ZO_ColorDef:New("6b5d39")
    ChampionBar.lines = {}
    for i=1,11 do
        local line = WINDOW_MANAGER:CreateControl("ChampionBar_CPLine"..i, parent, CT_LINE)
        local offset = ChampionBar.cpCurve(i*100000, ENLIGHTENMENT_MAX)/ENLIGHTENMENT_MAX*maxwidth-3
        line:SetAnchor(TOPLEFT, parent, TOPLEFT, offset, 0)
        line:SetAnchor(BOTTOMLEFT, parent, BOTTOMLEFT, offset, 0)
        line:SetThickness(2)
        line:SetColor(linecolor:UnpackRGBA())
        line:SetDrawLayer(DL_OVERLAY)
        table.insert(ChampionBar.lines, line)
    end

end

function ChampionBar.onLevelup(_, unit, vr)
    if unit == "player" and vr == 14 then
        ChampionBar.init()
    end
end

function ChampionBar.init()
    --Only show for max VR characters
    if GetUnitLevel("player") ~= 50 or GetUnitVeteranRank("player") ~= 14 then
        EVENT_MANAGER:RegisterForEvent("ChampionBar", EVENT_VETERAN_RANK_UPDATE, ChampionBar.onLevelup)
        return
    end
    if PLAYER_PROGRESS_BAR.barTypeClasses then
        ChampionBar.replaceBars()
        ChampionBar.replaceHandlers()
        ChampionBar.registerEvents()
        ChampionBar.addLines()
    end
    EVENT_MANAGER:UnregisterForEvent("ChampionBar", EVENT_PLAYER_ACTIVATED)
end

ChampionBar.readinStatus = (ZO_PlayerProgressBar_OnInitialized == nil)
--Currently just calling after finished. TOOD: Figure out how to prefill values
EVENT_MANAGER:RegisterForEvent("ChampionBar", EVENT_PLAYER_ACTIVATED, function() zo_callLater(ChampionBar.init,6000) end)