local eventframe = CreateFrame("FRAME", "WPvPFrame");
eventframe:RegisterEvent("PLAYER_ENTERING_WORLD");
eventframe:RegisterEvent("ADDON_LOADED");
eventframe:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED");
eventframe:RegisterEvent("PLAYER_TARGET_CHANGED");
eventframe:RegisterEvent("PLAYER_REGEN_ENABLED");
eventframe:RegisterEvent("PLAYER_REGEN_DISABLED");


ClassByName={}
PlayerNamesDisplayed={}
PlayerTrinketTimes={ }
PlayerLastActive={ }
PlayerHealth={ }
PlayerMaxHealth={ }
PlayerTargetable={ }
PlayerNamesList={ }
NumberOfFramesActive=0
local LastUpdate=GetTime()
local LastFrameUpgrade=GetTime()
CombatStatus=false
local LastCombatDrop=GetTime()


function eventHandler(self, event, ...)
	if event=="COMBAT_LOG_EVENT_UNFILTERED" then
		local timestamp, Event, hideCaster, sourceGUID, sourceName, sourceFlags, sourceRaidFlags, destGUID, destName, destFlags, destRaidFlags, param1, param2, param3, param4, param5,
		param6, param7, param8, param9, param10, param11, param12=...
	--print("wierd", wierd, "event", event, "timestamp", timestamp, "Event", Event, "sourceGUID", sourceGUID, "sourceName", sourceName, "sourceFlags", sourceFlags, "destGUID", destGUID,
	--"destName", destName, "destFlags", destFlags,
	--"param1-9", param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12)
		--Attempts to populate table for spells to identify classes faster.
		if string.find(Event, "SWING")==nil and string.find(Event, "ENVIRONMENTAL")==nil and sourceName then
			if bit.band(sourceFlags, 0x00000400)==0x00000400 then --unit was a player
				if SpellDatabase[param2] then --Encounter known spell in database that may characterize a class
					if (SpellDatabase[param2])[1] then --Spell isnt flagged as bad
						if (SpellDatabase[param2])[2] then --I KNOW this spell comes from the class listed
							if ClassByName[sourceName]==nil then
								ClassByName[sourceName]={(SpellDatabase[param2])[1], true, nil}
								SetFrameColors(sourceName)
								SetClassFrame(sourceName)
								--print("I found", sourceName, "to be a", (ClassByName[sourceName])[1])
							elseif (ClassByName[sourceName])[2]==false then 
								ClassByName[sourceName]={(SpellDatabase[param2])[1], true, nil}
								SetFrameColors(sourceName)
								SetClassFrame(sourceName)
								--print("I now know", sourceName, "to be a", (ClassByName[sourceName])[1], "with absolute certainty.")
							end
						else --I suspect this spell may come from the class listed, but may not
							if ClassByName[sourceName]==nil then --class entry does no exist, add it
								ClassByName[sourceName]={(SpellDatabase[param2])[1], false, nil}
								SetFrameColors(sourceName)
								SetClassFrame(sourceName)
								--print("I suspect", sourceName, "to be a", (ClassByName[sourceName])[1])
							else  --class entry exists
								if (ClassByName[sourceName])[2] then --Class is KNOWN 100%, spell is suspected in database of a class
									if (ClassByName[sourceName])[1]~=(SpellDatabase[param2])[1] then --Spell database spell conflicts class with known type
										--print("I found a spell conflict with", param2, "between", (ClassByName[sourceName])[1], "and", (SpellDatabase[param2])[1], ".  This spell has been flagged as bad.")
										SpellDatabase[param2]={nil, true} --Nil values mean spell does not characterize class
									end
								end
							end
						end
					end
				elseif ClassByName[sourceName] then --Player class is known or suspected, but spell is unknown
					if (ClassByName[sourceName])[2] then --I KNOW the players class 100%
						SpellDatabase[param2]={(ClassByName[sourceName])[1], false, nil}
						--print("I know", sourceName, "is a", (ClassByName[sourceName])[1], "so I suspect", param2, "comes from a", (ClassByName[sourceName])[1], ".")
						--This is false because I don't know if the spell was a class skill or something else.
					else --I suspect the players class may be correctly identified
					--	SpellDatabase[param2]={(ClassByName[sourceName])[1], false)}
					end
				end
				if SpecDatabase[param2] then --Encounter a known spell in database that will characterize a spec
					ClassByName[sourceName]={(SpecDatabase[param2])[1], true, (SpecDatabase[param2])[2]}
					SetClassFrame(sourceName)
					--print("found", sourceName, "to be a", (SpecDatabase[param2])[2], (SpecDatabase[param2])[1])
				end
			end
		end
		if Event=="SPELL_CAST_SUCCESS" and (param2=="Every Man For Himself" or param2=="PvP Trinket") then
			PlayerTrinketTimes[sourceName]=GetTime()
			if PlayerNamesDisplayed[sourceName] then
				_G["PlayerFrame" .. sourceName .. "Trinket"].cooldown:SetCooldown(GetTime(), 120)
			end
		end
		--if destName and bit.band(destFlags, 0x00000400)==0x00000400 then --unit was a player
		--	if PlayerNamesDisplayed[destName]==nil then
		--		AddFrame(destName)
		--		SetFrameColors(destName)
		--		AdjustFrameHeights()
		--		SetClassFrame(destName)
		--	end
		--end
		if sourceName and bit.band(sourceFlags, 0x00000400)==0x00000400 then --unit was a player
			if PlayerNamesDisplayed[sourceName]==nil then 
				PlayerHealth[sourceName]=nil
				PlayerMaxHealth[sourceName]=nil
				CalculateFrameHeights()
				AddFrame(sourceName)
				SetFrameColors(sourceName)
				if not CombatStatus then AdjustFrameHeights() end
				SetClassFrame(sourceName)
			end
		end
		if bit.band(sourceFlags, 0x00000400)==0x00000400 then --unit was a player
			if sourceName then 
				PlayerLastActive[sourceName]=GetTime()
			end
		end
		if bit.band(destFlags, 0x00000400)==0x00000400 then --unit was a player
			if destName then --player receiving damage or healing exists
				if PlayerHealth[destName] then --Health has been seen of this player in the past.
					if PlayerHealth[destname]==0 then --Player died and rezzed, we dont know their health
						PlayerHealth[destName]=nil
						PlayerMaxHealth[destName]=nil
					else
						if string.find(Event, "DAMAGE") then --subtracting health
							if string.find(Event, "SWING") then
								PlayerHealth[destName]=PlayerHealth[destName]-param1
							else
								PlayerHealth[destName]=PlayerHealth[destName]-param4
							end
						elseif string.find(Event, "HEAL") then
							PlayerHealth[destName]=PlayerHealth[destName]+param4
						end
						if PlayerHealth[destName]<0 then PlayerHealth[destName]=0 end
						if PlayerHealth[destName]>PlayerMaxHealth[destName] then
							PlayerHealth[destName]=PlayerMaxHealth[destName]
						end
					end
				end
			end
		end
	elseif event=="PLAYER_TARGET_CHANGED" then
		local targetname=UnitName("target")
		if targetname then 
			PlayerLastActive[targetname]=GetTime()
			if not PlayerNamesDisplayed[targetname] and UnitIsPlayer("target") then
				CalculateFrameHeights()
				AddFrame(targetname)
			end
			PlayerHealth[targetname]=UnitHealth("target")
			PlayerMaxHealth[targetname]=UnitHealthMax("target")
			local playerspec
			if ClassByName[targetname] then 
				playerspec=(ClassByName[targetname])[3]
			else
				playerspec=nil
			end
			ClassByName[targetname]={select(1, UnitClass("target")), true, playerspec}
			SetFrameColors(targetname)
			SetClassFrame(targetname)
			SetHealthBars()
		end
	elseif event=="ADDON_LOADED" then
		if XSize==nil then XSize=100 end
		if YSize==nil then YSize=300 end
		if FrameHeight==nil then FrameHeight=50 end
		if mainframe==nil then
			--Create the main background frame
			MainFrameCreate()
			_G["PlayerButton" .. 1]=CreateFrame("Button", nil, mainframe, "SecureActionButtonTemplate")
			_G["PlayerButton" .. 1]:SetPoint("TOP",mainframe , "TOP")
			CurrentParent=mainframe
			CreateSpellTable()
			CreateClassTable()
			CreateSpecTable()
		end
		if panel==nil then 
			panel=CreateFrame("Frame", "AddonPanel", UIParent);
			panel.name= "WPvP Frame"
			panel.refresh=function(self)
				XSizeSlider:SetValue(XSize)
				YSizeSlider:SetValue(YSize)
				FSizeSlider:SetValue(FrameHeight)
				if not CombatStatus then AdjustFrameHeights() end
				mainframe:SetWidth(XSize)
				mainframe:SetHeight(YSize)
				--Put checkbox stuff here
			end
			InterfaceOptions_AddCategory(panel);
			--Create Checkboxes
			CheckboxCreate()
			--Create the Frame height slider
			FSliderCreate()
			--Create X axis slider
			XSliderCreate()
			--Create Y axis slider
			YSliderCreate()
			--Create a test button for addon creatino
			TestButtonCreate()
		end
		CombatStatus=UnitAffectingCombat("player")
		CurrentFrameHeight=FrameHeight
	elseif event=="PLAYER_REGEN_ENABLED" then
		print("left combat")
		LastCombatDrop=GetTime()
		CombatStatus=false
		CalculateFrameHeights()
		AdjustFrameHeights()
		UpgradeFrames(true)
	elseif event=="PLAYER_REGEN_DISABLED" then
		print("entered combat")
		CombatStatus=true
	end
end
local function updateHandler()
	if GetTime()-LastUpdate>0.1 then
		if UnitHealth("target") then
			local targetname, targetrealm=UnitName("target")
			local targetnamerealm
			if targetrealm then
				targetnamerealm=targetname .. "-" .. targetrealm
			else 
				targetnamerealm=targetname
			end
			if targetnamerealm then
				PlayerHealth[targetnamerealm]=UnitHealth("target")
				PlayerMaxHealth[targetnamerealm]=UnitHealthMax("target")
			end
		end
		UpdateTrinketDisplay()
		if not CombatStatus then RemoveOldFrames() end
		SetHealthBars()
		LastUpdate=GetTime()
		SetFrameShades()
	end
	if GetTime()-LastFrameUpgrade>1 then
		if not CombatStatus then
			if GetTime()-LastCombatDrop>5 then
				UpgradeFrames(true)
			end
		end
		LastFrameUpgrade=GetTime()
	end
end
eventframe:SetScript("OnEvent", eventHandler);
eventframe:SetScript("OnUpdate", updateHandler);





