local SLE, T, E, L, V, P, G = unpack(select(2, ...)) 
local PvP = SLE:NewModule('PVP','AceHook-3.0', 'AceEvent-3.0')
--GLOBALS: hooksecurefunc, CreateFrame
local RepopMe, HasSoulstone = RepopMe, HasSoulstone
local COMBATLOG_HONORGAIN, COMBATLOG_HONORGAIN_NO_RANK, COMBATLOG_HONORAWARD = COMBATLOG_HONORGAIN, COMBATLOG_HONORGAIN_NO_RANK, COMBATLOG_HONORAWARD
local PVP_RANK_0_0 =PVP_RANK_0_0
local GetCurrencyInfo = GetCurrencyInfo
PvP.HonorStrings = {}
local FactionToken = UnitFactionGroup("player")
local bit_band = bit.band
local BG_Opponents = {
}
local _G = _G
local CancelDuel = CancelDuel
local StaticPopup_Hide = StaticPopup_Hide
local COMBATLOG_OBJECT_TYPE_PLAYER = COMBATLOG_OBJECT_TYPE_PLAYER
local RAID_CLASS_COLORS = RAID_CLASS_COLORS
local TopBannerManager_Show = TopBannerManager_Show
local BossBanner_BeginAnims = BossBanner_BeginAnims
local PlaySound = PlaySound
local CancelPetPVPDuel = C_PetBattles.CancelPVPDuel

function PvP:Release()
	if (PvP.db.rebirth and not HasSoulstone()) or not PvP.db.rebirth then RepopMe() end
end

function PvP:Dead()
	local inInstance, instanceType = T.IsInInstance()
	if not PvP.db.autorelease then return end --Option disabled = do jack shit
	if (inInstance and instanceType == "pvp") then
		PvP:Release()
		return --To prevent the rest of the function from execution when not needed
	end
	-- auto resurrection for world PvP area...when active
	for index = 1, T.GetNumWorldPVPAreas() do
		local _, localizedName, isActive, canQueue = T.GetWorldPVPAreaInfo(index)
		if (T.GetRealZoneText() == localizedName and isActive) or (T.GetRealZoneText() == localizedName and canQueue) then PvP:Release() end
	end
end

function PvP:UpdatePvPHolder()
	if PvP.CaptureBar1 then
		PvP.CaptureBar1:HookScript("OnShow", function(self) self:SetPoint("TOP", PvP.AlwaysUpFrame, "BOTTOM", 0, -10) end)
		PvP.CaptureBar1:Hide()
		PvP.CaptureBar1:Show()
		PvP:UnregisterEvent("UPDATE_WORLD_STATES")
	end
end

function PvP:Duels(event, name)
	local cancelled = false
	if event == "DUEL_REQUESTED" and PvP.db.duels.regular then
		CancelDuel()
		StaticPopup_Hide("DUEL_REQUESTED")
		cancelled = "REGULAR"
	elseif event == "PET_BATTLE_PVP_DUEL_REQUESTED" and PvP.db.duels.pet then
		CancelPetPVPDuel()
		StaticPopup_Hide("PET_BATTLE_PVP_DUEL_REQUESTED")
		cancelled = "PET"
	end
	if cancelled then
		SLE:Print(T.format(L["SLE_DuelCancel_"..cancelled], name))
	end
end

function PvP:OpponentsTable()
	T.twipe(BG_Opponents)
	for index = 1, T.GetNumBattlefieldScores() do
		local name, _, _, _, _, faction, _, _, classToken = T.GetBattlefieldScore(index)
		if (FactionToken == "Horde" and faction == 1) or (FactionToken == "Alliance" and faction == 0) then
			BG_Opponents[name] = classToken
		end
	end
end

function PvP:LogParse(event, ...)
	local _, subevent, _, _, Caster, _, _, _, TargetName, TargetFlags = ...
	if subevent == "PARTY_KILL" then
		local mask = bit_band(TargetFlags, COMBATLOG_OBJECT_TYPE_PLAYER)
		if Caster == E.myname and (BG_Opponents[TargetName] or mask > 0) then
			if mask > 0 and BG_Opponents[TargetName] then TargetName = "|c"..RAID_CLASS_COLORS[BG_Opponents[TargetName]].colorStr..TargetName.."|r" end
			TopBannerManager_Show(_G["BossBanner"], { name = TargetName, mode = "PVPKILL" });
		end
	end
end

function PvP:Initialize()
	if not SLE.initialized then return end
	PvP.db = E.db.sle.pvp
	PvP.AlwaysUpFrame = _G["WorldStateAlwaysUpFrame"]
	PvP.CaptureBar1 = _G["WorldStateCaptureBar1"]
	--AutoRes event
	self:RegisterEvent("PLAYER_DEAD", "Dead");
	--Mover for pvp info
	PvP.holder = CreateFrame("Frame", "SLE_PvPHolder", E.UIParent)
	PvP.holder:SetSize(10, 58)
	PvP.holder:SetPoint("TOP", E.UIParent, "TOP", -5, -15)
	PvP.AlwaysUpFrame:ClearAllPoints()
	PvP.AlwaysUpFrame:SetPoint("CENTER", PvP.holder)
	self:RegisterEvent("UPDATE_WORLD_STATES", "UpdatePvPHolder")
	E:CreateMover(PvP.holder, "PvPMover", "PvP", nil, nil, nil, "ALL,S&L,S&L MISC")

	self:RegisterEvent("DUEL_REQUESTED", "Duels")
	self:RegisterEvent("PET_BATTLE_PVP_DUEL_REQUESTED", "Duels")

	function PvP:ForUpdateAll()
		PvP.db = E.db.sle.pvp
	end
	
	if E.private.sle.pvp.KBbanner.enable then
		hooksecurefunc(_G["BossBanner"], "PlayBanner", function(self, data)
			if ( data ) then
				if ( data.mode == "PVPKILL" ) then
					self.Title:SetText(data.name);
					self.Title:Show();
					self.SubTitle:Hide();
					self:Show();
					BossBanner_BeginAnims(self);
					if E.private.sle.pvp.KBbanner.sound then PlaySound("UI_Raid_Boss_Defeated") end
				end
			end
		end)
		self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED", "LogParse")
		self:RegisterEvent("UPDATE_BATTLEFIELD_SCORE", "OpponentsTable")
	end
end

SLE:RegisterModule(PvP:GetName())