module( "team", package.seeall )

local TeamInfo = {}
local DefaultColor = Color( 255, 255, 100, 255 )

TeamInfo[TEAM_CONNECTING] 	= { Name = "Joining/Connecting", 	Color = DefaultColor, 	Score = 0, 	Joinable = false }
TeamInfo[TEAM_UNASSIGNED] 	= { Name = "Unassigned", 			Color = DefaultColor, 	Score = 0, 	Joinable = false }
TeamInfo[TEAM_SPECTATOR] 	= { Name = "Spectator", 			Color = DefaultColor, 	Score = 0, 	Joinable = true }

--[[------------------------------------------------------------

	Call this to set up your team. It should be called in
	a shared file. This system assumes that your teams are
	static. If you want to have dynamic teams you need to
	code this yourself.

	id should be a number. It's best to do something like

	TEAM_TERRORISTS = 2

	at the top of your code somewhere so you can reference
	teams via a variable rather than a number.

--------------------------------------------------------------]]
function SetUp( id, name, color, joinable )

	if ( joinable == nil ) then joinable = true end

	TeamInfo[id] = { Name = name, Color = color, Score = 0, Joinable = joinable }

end


function GetAllTeams()

	return TeamInfo -- copyof?

end

function Valid( id )

	if ( !TeamInfo[id] ) then return false end
	return true

end

function Joinable( id )

	if ( !TeamInfo[id] ) then return false end
	return TeamInfo[id].Joinable

end

function GetSpawnPoint( id )

	if ( !TeamInfo[id] ) then return end
	return TeamInfo[id].SpawnPointTable

end

function GetSpawnPoints( id )

	if ( IsTableOfEntitiesValid( TeamInfo[id].SpawnPoints ) ) then return TeamInfo[id].SpawnPoints end

	local SpawnPointTable = team.GetSpawnPoint( id )
	if ( !SpawnPointTable ) then return end

	TeamInfo[id].SpawnPoints = {}

	for k, entname in pairs( SpawnPointTable ) do

		TeamInfo[id].SpawnPoints = table.Add( TeamInfo[id].SpawnPoints, ents.FindByClass( entname ) )

	end

	return TeamInfo[id].SpawnPoints

end

function SetSpawnPoint( id, ent_name )

	if ( !TeamInfo[id] ) then return end
	if ( !istable( ent_name ) ) then ent_name = { ent_name } end

	TeamInfo[id].SpawnPointTable = ent_name

end

function SetClass( id, classtable )

	if ( !TeamInfo[id] ) then return end
	if ( !istable( classtable ) ) then classtable = { classtable } end

	TeamInfo[id].SelectableClasses = classtable

end

function GetClass( id )

	if ( !TeamInfo[id] ) then return end
	return TeamInfo[id].SelectableClasses

end

function TotalDeaths( index )

	local score = 0

	for _, ply in player.Iterator() do
		if ( ply:Team() == index ) then
			score = score + ply:Deaths()
		end
	end

	return score

end

function TotalFrags( index )

	local score = 0

	for _, ply in player.Iterator() do
		if ( ply:Team() == index ) then
			score = score + ply:Frags()
		end
	end

	return score

end

function NumPlayers( index )

	local players = 0

	for _, ply in player.Iterator() do
		if ( ply:Team() == index ) then
			players = players + 1
		end
	end

	return players

end

function GetPlayers( index )

	local TeamPlayers = {}

	for _, ply in player.Iterator() do
		if ( ply:Team() == index ) then
			table.insert(TeamPlayers, ply)
		end
	end

	return TeamPlayers

end

function GetScore( index )

	return GetGlobalInt( "Team." .. tostring( index ) .. ".Score", 0 )

end

function GetName( index )

	if ( !TeamInfo[index] ) then return "" end
	return TeamInfo[index].Name

end

function SetColor( index, color )

	if ( !TeamInfo[ index ] ) then return false end
	TeamInfo[ index ].Color = color

	return color

end

function GetColor( index )

	local color = TeamInfo[index] && TeamInfo[index].Color || DefaultColor
	return Color( color.r, color.g, color.b, color.a )

end

function SetScore( index, score )

	return SetGlobalInt( "Team." .. tostring( index ) .. ".Score", score )

end

function AddScore(index, score)

	SetScore( index, GetScore( index ) + score )

end

function BestAutoJoinTeam()

	local SmallestTeam = TEAM_UNASSIGNED
	local SmallestPlayers = 1000

	for id, tm in pairs( team.GetAllTeams() ) do

		if ( id != TEAM_SPECTATOR && id != TEAM_UNASSIGNED && id != TEAM_CONNECTING && tm.Joinable ) then

			local PlayerCount = team.NumPlayers( id )
			if ( PlayerCount < SmallestPlayers || (PlayerCount == SmallestPlayers && id < SmallestTeam ) ) then
				SmallestPlayers = PlayerCount
				SmallestTeam = id
			end

		end

	end

	return SmallestTeam

end
