package de.thomas.creatures.implementation.model;

import java.awt.Point;

import de.thomas.creatures.implementation.ai.CreatureAI;
import de.thomas.creatures.implementation.ai.DoNothingAI;

public class Creature {
	public enum Gender { MALE, FEMALE };
	
	private double life;
	private double maxLife;
	private double energy;
	private double maxEnergy;
	private Point.Double position;
	private double speed;
	private double visionRange;
	private Gender gender;
	private CreatureAI ai;
	private double matingEnergyNeeded;
	private double breedLength;
	private double breedProgressSpeed;
	private double breedTime;
	private boolean pregnant;
	private Creature fetus;
	
	private Point.Double target;
	
	//For test purposes
	public Creature(Point.Double position, Gender gender) {
		this(
				1000, 
				1000, 
				500, 
				position,
				24, 
				100, 
				gender, 
				new DoNothingAI(), 
				100, 
				200, 
				5);
	}
	
	public Creature(
			double energy, 
			double maxEnergy, 
			double maxLife,
			Point.Double position, 
			double speed, 
			double visionRange, 
			Gender gender, 
			CreatureAI ai, 
			double matingEnergyNeeded,
			double breedLength, 
			double breedProgressSpeed) {
		
		this.energy = energy;
		this.maxEnergy = maxEnergy;
		this.setMaxLife(maxLife);
		this.position = position;
		this.speed = speed;
		this.visionRange = visionRange;
		this.gender = gender;
		this.ai = ai;
		this.matingEnergyNeeded = matingEnergyNeeded;
		this.breedLength = breedLength;
		this.breedProgressSpeed = breedProgressSpeed;
		
		this.target = null;
		this.pregnant = false;
		this.breedTime = breedLength;
		this.life = 0;
	}

	public void update() {
		ai.update();
	}
	
	public Point.Double getPosition() {
		return position;
	}

	public void setPosition(Point.Double position) {
		this.position = position;
	}

	public double getSpeed() {
		return speed;
	}

	public void setSpeed(double speed) {
		this.speed = speed;
	}
	
	public Gender getGender() {
		return gender;
	}
	
	public void setGender(Gender gender) {
		this.gender = gender;
	}

	public Point.Double getTarget() {
		return target;
	}

	public void setTarget(Point.Double target) {
		this.target = target;
	}

	public double getEnergy() {
		return energy;
	}

	public void setEnergy(double energy) {
		this.energy = energy;
	}

	public CreatureAI getAi() {
		return ai;
	}

	public void setAi(CreatureAI ai) {
		this.ai = ai;
	}

	public double getVisionRange() {
		return visionRange;
	}

	public void setVisionRange(double visionRange) {
		this.visionRange = visionRange;
	}

	public double getMaxEnergy() {
		return maxEnergy;
	}

	public void setMaxEnergy(double maxEnergy) {
		this.maxEnergy = maxEnergy;
	}

	public double getLife() {
		return life;
	}

	public void setLife(double life) {
		this.life = life;
	}

	public double getMatingEnergyNeeded() {
		return matingEnergyNeeded;
	}

	public void setMatingEnergyNeeded(double matingEnergyNeeded) {
		this.matingEnergyNeeded = matingEnergyNeeded;
	}

	public double getBreedTime() {
		return breedTime;
	}

	public void setBreedTime(double breedTime) {
		this.breedTime = breedTime;
	}

	public boolean isPregnant() {
		return pregnant;
	}

	public void setPregnant(boolean pregnant) {
		this.pregnant = pregnant;
	}

	public double getBreedLength() {
		return breedLength;
	}

	public void setBreedLength(double breedLength) {
		this.breedLength = breedLength;
	}

	public double getBreedProgressSpeed() {
		return breedProgressSpeed;
	}

	public void setBreedProgressSpeed(double breedProgressSpeed) {
		this.breedProgressSpeed = breedProgressSpeed;
	}

	public double getMaxLife() {
		return maxLife;
	}

	public void setMaxLife(double maxLife) {
		this.maxLife = maxLife;
	}

	public Creature getFetus() {
		return fetus;
	}

	public void setFetus(Creature fetus) {
		this.fetus = fetus;
	}
}