/*******************************************************************************
 * Copyright 2015 See AUTHORS file.
 * <p/>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p/>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p/>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/

package com.mygdx.game.steerers;

import com.badlogic.gdx.ai.steer.SteeringAcceleration;
import com.badlogic.gdx.ai.steer.behaviors.Wander;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector3;
import com.mygdx.game.GameRenderer;
import com.mygdx.game.objects.SteerableBody;
import com.mygdx.game.utilities.MyShapeRenderer;

/**
 * A steerer to wander while avoiding collisions. 
 * 
 * @author davebaol
 */
public class WanderSteerer extends CollisionAvoidanceSteererBase {

	final Wander<Vector3> wanderSB;
	boolean keepWandering;
	
	public WanderSteerer(final SteerableBody steerableBody) {
		super(steerableBody);

		this.wanderSB = new Wander<Vector3>(steerableBody) {
			@Override
			protected SteeringAcceleration<Vector3> calculateRealSteering(SteeringAcceleration<Vector3> steering) {
				super.calculateRealSteering(steering);
				steering.linear.y = 0; // remove any vertical acceleration
				return steering;
			}
		};
		this.wanderSB.setWanderOffset(8) //
			.setWanderOrientation(0) //
			.setWanderRadius(0.5f) //
			.setWanderRate(MathUtils.PI2 * 4);

		this.prioritySteering.add(wanderSB);
	}

	public void startWandering() {
		steerableBody.steerer = this;
		keepWandering = true;
	}

	public void stopWandering() {
		keepWandering = false;
	}
	
	@Override
	public boolean processSteering (SteeringAcceleration<Vector3> steering) {
		return keepWandering;
	}

	@Override
	public void startSteering () {
	}

	@Override
	public boolean stopSteering () {
		return false;
	}
	
	@Override
	public void draw(GameRenderer gameRenderer) {
		super.draw(gameRenderer);
		
		MyShapeRenderer shapeRenderer = gameRenderer.shapeRenderer;

		// Draw wander circle
		shapeRenderer.begin(MyShapeRenderer.ShapeType.Line);
		shapeRenderer.setColor(Color.CORAL);
		Vector3 wanderCenter = wanderSB.getWanderCenter();
		shapeRenderer.circle3(wanderCenter.x, wanderCenter.y - steerableBody.halfExtents.y, wanderCenter.z, wanderSB.getWanderRadius(), 12);
		shapeRenderer.end();

		// Draw wander target
		shapeRenderer.begin(MyShapeRenderer.ShapeType.Filled);
		shapeRenderer.setColor(Color.CORAL);
		Vector3 wanderTarget = wanderSB.getInternalTargetPosition();
		shapeRenderer.circle3(wanderTarget.x, wanderTarget.y - steerableBody.halfExtents.y, wanderTarget.z, .1f, 6);
		shapeRenderer.end();
	}

}