Pointshop2.PropHunt = {}

local S = function( id )
	return Pointshop2.GetSetting( "Prop Hunt Integration", id )
end

function Pointshop2.PropHunt.PreRoundStart( num )
	if team.NumPlayers( TEAM_PROPS ) == 0 or team.NumPlayers( TEAM_HUNTERS ) == 0 then return end
	GAMEMODE.ps2TeamPlayers = GAMEMODE.ps2TeamPlayers or {
		[TEAM_PROPS] = {},
		[TEAM_HUNTERS] = {}
	}

	for k, v in pairs( player.GetAll( ) ) do
		GAMEMODE.ps2TeamPlayers[v:Team()] = GAMEMODE.ps2TeamPlayers[v:Team()] or {}
		table.insert( GAMEMODE.ps2TeamPlayers[v:Team()],  v )
	end

	if #player.GetAll( ) > S('RoundWin.MinimumPlayers') then
		GAMEMODE.Jackpot = #player.GetAll( ) * S('RoundWin.TimeJackpotPerPlayer')
		for k, v in pairs( player.GetAll( ) ) do
			if v:Team() == TEAM_HUNTERS then
				v:PS2_DisplayInformation( "Round started. Points pot is at " .. GAMEMODE.Jackpot .. " points. It decreases by " .. math.floor( GAMEMODE.Jackpot / ( GAMEMODE.RoundLength / 60 ) ) .. " points every minute, kill the Props quickly for maximum reward!" )
			end
		end
		GAMEMODE.PS2_NoPoints = false
	else
		GAMEMODE.PS2_NoPoints = true
		Pointshop2.BroadcastInfo( "No points will be given this round. Minimum of " .. S('RoundWin.MinimumPlayers') .. " players required" )
	end
end

function Pointshop2.PropHunt.SetRoundResult( result )
	if GAMEMODE.PS2_NoPoints then
		return
	end

	if result == 1001 then
		return
	end

	GAMEMODE.ps2TeamPlayers = GAMEMODE.ps2TeamPlayers or {
		[TEAM_PROPS] = {},
		[TEAM_HUNTERS] = {}
	}

	Pointshop2.StandardPointsBatch:begin( )
	if result == TEAM_PROPS then
		for k, v in pairs( GAMEMODE.ps2TeamPlayers[TEAM_PROPS] ) do
			if not IsValid( v ) then
				return
			end

			if v:Alive() and v:Team( ) == TEAM_PROPS then
				v:PS2_AddStandardPoints( S('RoundWin.AliveBonus'), 'Alive Bonus', true )
			end
			v:PS2_AddStandardPoints( S('RoundWin.PropsWin'), 'Winning the round' )
		end
	end

	if result == TEAM_HUNTERS then
		local aliveHuntersCount = 0
		for k, v in pairs( GAMEMODE.ps2TeamPlayers[TEAM_HUNTERS] ) do
			if IsValid( v ) and v:Alive() and v:Team() == TEAM_HUNTERS then
				aliveHuntersCount = aliveHuntersCount + 1
			end
		end
		for k, v in pairs( GAMEMODE.ps2TeamPlayers[TEAM_HUNTERS] ) do
			if not IsValid( v ) then
				return
			end

			if v:Alive() and v:Team( ) == TEAM_HUNTERS then
				v:PS2_AddStandardPoints( S('RoundWin.AliveBonus'), 'Alive Bonus', true )
			end
			local timeElapsed = GetGlobalFloat( "RoundEndTime" ) - CurTime()
			timeElapsed = timeElapsed > 0 and timeElapsed or GAMEMODE.RoundLength
			local pot = GAMEMODE.Jackpot * ( 1 - timeElapsed / GAMEMODE.RoundLength )
			v:PS2_AddStandardPoints( math.floor( pot / aliveHuntersCount ), 'Winning the round', true )
		end
	end
	Pointshop2.StandardPointsBatch:finish( )

	hook.Call( "Pointshop2GmIntegration_RoundEnded" )
end

function Pointshop2.PropHunt.OnPropKilled( victim, inflictor, attacker )
	if attacker:IsPlayer( ) and not GAMEMODE.PS2_NoPoints then
		attacker:PS2_AddStandardPoints( S("Kills.HunterKillsProp"), "Killed Prop" )
	end
end
if PHX and PHX ~= nil then
	hook.Add("PH_OnPropKilled", "PH_PS2_PropKilled", Pointshop2.PropHunt.OnPropKilled ) -- We'll use from provided PH:X hook instead.
else
	hook.Add( "PS2_PH_PropKilled", "PH_PropKilled", Pointshop2.PropHunt.OnPropKilled )
end

local function installHooks( )
	GAMEMODE.OriginalSetRoundResult = GAMEMODE.OriginalSetRoundResult or GAMEMODE.SetRoundResult -- need to use this as fretta resets timer before OnRoundResult
	GAMEMODE.OriginalPreRoundStart = GAMEMODE.OriginalPreRoundStart or GAMEMODE.PreRoundStart

	function GAMEMODE:SetRoundResult( result, resulttext )
		Pointshop2.PropHunt.SetRoundResult( result )
		GAMEMODE.OriginalSetRoundResult( self, result, resulttext )
	end

	function GAMEMODE:PreRoundStart( num )
		GAMEMODE.OriginalPreRoundStart( self, num )
		Pointshop2.PropHunt.PreRoundStart( num )
	end
end

LibK.WhenAddonsLoaded{ "Pointshop2" }:Then( installHooks )
hook.Add( "OnReloaded", "PS2_ReloadPropHuntHooks", installHooks )