--GLOBAL NAMESPACE
local _G = _G;
--LUA
local unpack        = _G.unpack;
local select        = _G.select;

local class = select(2, UnitClass("player"));
if(class ~= "ROGUE") then return end;

local assert        = _G.assert;
local error         = _G.error;
local print         = _G.print;
local pairs         = _G.pairs;
local next          = _G.next;
local tostring      = _G.tostring;
local type  		= _G.type;
--STRING
local string        = _G.string;
local format        = string.format;
--MATH
local math          = _G.math;
local floor         = math.floor
local ceil          = math.ceil
--TABLE
local table         = _G.table;
local wipe          = _G.wipe;
--BLIZZARD API
local GetShapeshiftForm         = _G.GetShapeshiftForm;
local UnitHasVehicleUI 			= _G.UnitHasVehicleUI;
local UnitBuff         			= _G.UnitBuff;
local MAX_COMBO_POINTS      	= _G.MAX_COMBO_POINTS;
local GetSpellInfo      		= _G.GetSpellInfo;
local GetComboPoints  			= _G.GetComboPoints;

local parent, ns = ...
local oUF = ns.oUF

local ALERTED = false
local TextColors = {
	[1]={1,0.1,0.1},
	[2]={1,0.5,0.1},
	[3]={1,1,0.1},
	[4]={0.5,1,0.1},
	[5]={0.1,1,0.1}
};

local Update = function(self, event, unit)
	if(not (unit == 'player')) then return end
	local bar = self.HyperCombo;
	local cpoints = bar.Combo;
	local current = 0
	if(UnitHasVehicleUI'player') then
		current = UnitPower("vehicle", SPELL_POWER_COMBO_POINTS);
	else
		current = UnitPower("player", SPELL_POWER_COMBO_POINTS);
	end

	if(cpoints and current) then
		if(bar.PreUpdate) then
			bar:PreUpdate()
		end

		local MAX_COMBO_POINTS = UnitPowerMax("player", SPELL_POWER_COMBO_POINTS);
		for i=1, MAX_COMBO_POINTS do
			if(i <= current) then
				if (cpoints[i]) then
					cpoints[i]:Show()
					if(bar.PointShow) then
						bar.PointShow(cpoints[i])
					end
				end
			else
				if (cpoints[i]) then
					cpoints[i]:Hide()
					if(bar.PointHide) then
						bar.PointHide(cpoints[i], i)
					end
				end
			end
		end

		if(bar.PostUpdate) then
			return bar:PostUpdate(current)
		end
	end
end

local Path = function(self, ...)
	return (self.HyperCombo.Override or Update) (self, ...)
end

local ForceUpdate = function(element)
	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
end

local Enable = function(self)
	local bar = self.HyperCombo
	if(bar) then
		bar.__owner = self
		bar.ForceUpdate = ForceUpdate
		self:RegisterEvent('PLAYER_ENTERING_WORLD', Path, true)
		self:RegisterEvent('PLAYER_TARGET_CHANGED', Path, true)
		self:RegisterEvent('UNIT_DISPLAYPOWER', Path, true)
		self:RegisterUnitEvent('UNIT_DISPLAYPOWER', "player")
		self:RegisterEvent('UNIT_POWER_FREQUENT', Path, true)
		self:RegisterUnitEvent("UNIT_POWER_FREQUENT", "player")
		self:RegisterEvent('UNIT_MAXPOWER', Path, true)
		self:RegisterUnitEvent("UNIT_MAXPOWER", "player")
		
		local cpoints = bar.Combo;
		if(cpoints) then
			local maxComboPoints = UnitPowerMax("player", SPELL_POWER_COMBO_POINTS);
			for index = 1, maxComboPoints do
				local cpoint = cpoints[index]
				if(cpoint and cpoint:IsObjectType'Texture' and not cpoint:GetTexture()) then
					cpoint:SetTexture[[Interface\ComboFrame\ComboPoint]]
					cpoint:SetTexCoord(0, 0.375, 0, 1)
				end
			end
		end
		return true
	end
end

local Disable = function(self)
	local bar = self.HyperCombo
	if(bar) then
		local cpoints = bar.Combo;
		if(cpoints) then
			local maxComboPoints = UnitPowerMax(self.unit, SPELL_POWER_COMBO_POINTS);
			for index = 1, maxComboPoints do
				if (cpoints[index]) then cpoints[index]:Hide() end
			end
		end
		self:UnregisterEvent('PLAYER_ENTERING_WORLD', Path)
		self:UnregisterEvent('UNIT_DISPLAYPOWER', Path)
		self:UnregisterEvent('PLAYER_TARGET_CHANGED', Path)
		self:UnregisterEvent('UNIT_POWER_FREQUENT', Path)
		self:UnregisterEvent('UNIT_MAXPOWER', Path)
	end
end

oUF:AddElement('HyperCombo', Path, Enable, Disable)
