import java.util.*;
import java.awt.*;

public class APerson {
  String name;
  double x, y;
  int size;
  double vx, vy;
  APeopleSpace space;
  Color color;
  static Random r;
  boolean recentCollision;
  Vector iLike, iDontLike;

  APerson(String n, Color c, APeopleSpace s){
    if (r == null)
      r= new Random();
    name = n;
    space = s;
    color = c;
    size = 10;
    x = (space.getSize().width*r.nextFloat()) - (space.getSize().width/2);
    y = (space.getSize().height*r.nextFloat()) - (space.getSize().height/2);
    vx = vy = 0;
    iLike = new Vector();
    iDontLike = new Vector();
  }

  public void affinity(String who){
    iLike.addElement(who);
  }

  public void distaste(String who){
    iDontLike.addElement(who);
  }

  public void tick() {
    if(recentCollision) {
      vx = -.5*vx;
      vy = -.5*vy;
      recentCollision=false;
    }
    for(Enumeration e = iLike.elements(); e.hasMoreElements();){
      String w = (String) e.nextElement();
      APerson like = (APerson) space.byName.get(w);
      double dx = (x-like.x);
      double dy = (y-like.y);
      double dist = Math.sqrt(dx*dx + dy*dy);
      if(dist > 80){
	// Move toward them
	if(dx > 0)
	  vx -= .05*(Math.abs(dx)/dist);
	else
	  vx += .05*(Math.abs(dx)/dist);

	if(dy > 0)
	  vy -= .05*(Math.abs(dy)/dist);
	else
	  vy += .05*(Math.abs(dy)/dist);
      }
      else {
	vx*=.9;
	vy*=.9;
      }
    }

    for(Enumeration e = iDontLike.elements(); e.hasMoreElements();){
      String w = (String) e.nextElement();
      APerson like = (APerson) space.byName.get(w);
      double dx = (x-like.x);
      double dy = (y-like.y);
      double dist = Math.sqrt(dx*dx + dy*dy);
      if(dist < 100){
	// Move away from them
	if(dx > 0)
	  vx += .05*(Math.abs(dx)/dist);
	else
	  vx -= .05*(Math.abs(dx)/dist);

	if(dy > 0)
	  vy += .05*(Math.abs(dy)/dist);
	else
	  vy -= .05*(Math.abs(dy)/dist);
      }
      else {
	vx*=.9;
	vy*=.9;
      }
    }      
    if(!space.collision(x+vx, y+vy, size)) {
      x = x+vx;
      y = y+vy;
    }
    else{
      recentCollision=true;
    }
  }

  public void draw(Graphics g){
    g.setColor(color);
    g.fillArc(((int) x)-(size/2), ((int) y)-(size/2), size, size, 0, 360);
  }
}
