extends RigidBody

sync var left = 0
sync var right = 0
var active = false
var right_active = false
var activation_margin = 0.1

var update_frequency = 2 # In secs. This isn't too fast-paced, so don't clog the network with updates every frame
var update_count = 0

var master_team_right = null
var friend_color
var enemy_color

var build_rate = 1.5
var restart_count = 0
var restart_time = 15

slave func set_status(status):
	transform = status[0]
	angular_velocity = status[1]

func get_status():
	return [
		transform,
		angular_velocity,
	]

func _process(delta):

	# Figure out what team we're on
	# We have to do this here because we never know when the master player will actually be added
	if master_team_right == null:
		var master_player = util.get_master_player()
		if master_player:
			master_team_right = master_player.player_info.is_right_team
			friend_color = master_player.friend_color
			enemy_color = master_player.enemy_color
		else:
			master_team_right = true # Doesn't matter, it's all graphical and we're headless
			friend_color = Color()
			enemy_color = Color()
		var name = "right" if master_team_right else "left"
		var full_name = "res://assets/objective-%s.png" % name
		get_node("MeshInstance").get_surface_material(0).albedo_texture = load(full_name)

	# Check what's active
	var rot = rotation.x
	if active:
		activation_margin = 0
	if rot > activation_margin:
		active = true
		right_active = false
	if rot < -activation_margin:
		active = true
		right_active = true
	if active:
		if right_active == master_team_right:
			# We DO own the correct one; display left counting, blue
			get_node("../HUD/LeftTeam").add_color_override("font_color_shadow", friend_color)
			get_node("../HUD/RightTeam").add_color_override("font_color_shadow", Color(0,0,0,0))
		else:
			# We DO NOT own the correct one; display right counting, red
			get_node("../HUD/LeftTeam").add_color_override("font_color_shadow", Color(0,0,0,0))
			get_node("../HUD/RightTeam").add_color_override("font_color_shadow", enemy_color)

	# Count the percents
	if active:
		if right_active:
			right += delta * build_rate
		else:
			left += delta * build_rate
	update_count += delta / Engine.time_scale # This is important so we update at 100% as well
	if is_network_master() and update_count > update_frequency:
		update_count = 0
		rset("left", left)
		rset("right", right)
	if is_network_master():
		rpc_unreliable("set_status", get_status())

	# Check for game over
	var game_over = false
	var winner_right
	if left >= 100:
		game_over = true
		winner_right = false
		left = 100
	if right >= 100:
		game_over = true
		winner_right = true
		right = 100
	if game_over:
		var text = "You lose :("
		if winner_right == master_team_right:
			text = "You win!!!"
		get_node("../HUD/Finish").set_text(text)
		Engine.time_scale = 0.1
		# You won't believe this, but because time_scale is 0.1 we have to multiply times 10 for proper timing
		restart_count += delta / Engine.time_scale
	if restart_count > restart_time:
		Engine.time_scale = 1
		if is_network_master():
			get_node("/root/Lobby").rpc("reset_state")

	# Render the percents
	var on_left = left
	var on_right = right
	# Always display OUR team on the LEFT (in blue)
	if master_team_right:
		on_left = right
		on_right = left
	get_node("../HUD/LeftTeam").set_text("%d%%" % on_left)
	get_node("../HUD/RightTeam").set_text("%d%%" % on_right)

func _exit_tree():
	var lobby = get_node("/root/Lobby")
	lobby.call_deferred("pre_configure_game", lobby.my_info.level)