-- global vars
patrolDestination = { x=500.0, y=500.0, z=0.0 }
moveLeft = true
-- helper functions
function watchPosition(actor, pos)
	local y = pos.y - actor.position.y
	local x = pos.x - actor.position.x
	local rotation = math.atan(y, x)
	actor.rotation = math.deg(rotation)
end

function distance(a, b)
	local dx = a.x - b.x
	local dy = a.y - b.y
	return math.sqrt(dx * dx + dy * dy)
end

function moveTo(actor, pos)
	local a = actor
	local p = pos
	watchPosition(a, p)
	if distance(a.position, p) < 50 then 
		return true
	end
	a:moveForward()
	return false
end

-- Behaviour Functions called on AI

-- These functions are ai behaviour functions called in the game
-- The AI will be spawned in idle mode, so if you want to put the bot into patrol mode 
-- It's on you to do that in this function.
function idle(actor, target)
	local a = actor
	local t = target
	if t ~= nil then
	--	print("target is at " .. target.position.x)
	--	watchPosition(actor, target.position)
		ai.state = AIState.Patrol
		a.rotation = 180
	end
	a:shoot()
	--print("actor is idling at " .. actor.position.x)
end

-- It is most appropriate to put any patrolling behaviour into this function of course
function patrol(actor, target)
	local a = actor
	local t = target
	if t ~= nil then
	--	print("target is at " .. target.position.x)
	end
	--if moveTo(actor, patrolDestination) == true then
	--	patrolDestination = { x=math.random(400.0, 750.0), y=math.random(400.0, 750.0), z=0.0 }
	--end
	-- performRaycast returns if true if the raycast hits the target position it also sets the getter function
	-- distFromWall, at bot creation distFromWall is and infinite float value.
	-- This performRaycast function is highly discourage due to slow down
	--if raycaster:performRaycast(actor.position, actor.rotation, target.position) == true then
		--ai.state = AIState.Alert
	--end
	if raycaster:bresenhamRaycast(a.position, a.rotation, t.position) == true then
		--target hit!
		ai.state = AIState.Alert
	end
	if raycaster:distFromWall() < 3 then
		upOrDown = math.random(2)
		if moveLeft == true then
			if upOrDown == 1 then
				a.rotation = 180
			else
				a.rotation = 270
			end
			moveLeft = false
		else 
			if upOrDown == 1 then
				a.rotation = 0
			else
				a.rotation = 90
			end
			moveLeft = true
		end
	end
	a:moveForward()
end

-- the ai has found the player, this is what function is called
function alert(actor, target)
	local a = actor
	local t = target
	if target ~= nil then
	--	print("target is at " .. target.position.x)
		watchPosition(a, t.position)
	end
	--print("actor is alert at " .. actor.position.x)
	if distance(a.position, t.position) > 300 then
		a:moveForward()
	end
	a:shoot()
end
