package chainreaction;

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

class Atom {

private static final Comparator<Point> myPointComparator =
                                       new Comparator<Point>() {
@Override
public int compare(Point o1, Point o2) {
  return Integer.valueOf((o1.y + 75) * 800 + o1.x + 75).
          compareTo((o2.y + 75) * 800 + o2.x + 75);
}
};
static Map<Point, Atom> atoms = new TreeMap<Point, Atom>(myPointComparator);
private int x, y;
private double size;
private static Random random = new Random();

public Atom() {
  x = y = 0;
  size = random.nextInt(4) + 1;
}

void setCoords(int x, int y) {
  this.x = x;
  this.y = y;
}

void paint(Graphics gr) {
  if (size >= 5) {
    return;
  }
  double dx = 25 - size * 5;
  double dy = 25 - size * 5;
  gr.translate(x, y);
  int r = 0, g = 0, b = 0;
  if (size < 2) {
    g = (int) ((size - 1) * 255);
    r = 0;
    b = 255;
  } else if (size < 3) {
    g = 255;
    r = 0;
    b = 255 - (int) ((size - 2) * 255);
  } else if (size < 4) {
    g = 222;
    r = (int) ((size - 3) * 255);
    b = 0;
  } else if (size < 5) {
    r = 255;
    b = 0;
    g = 255 - (int) ((size - 4) * 255);
  }
  gr.setColor(new Color(r, g, b));
  gr.fillRect((int) dx, (int) dy, (int) (50 - 2 * dx), (int) (50 - 2 * dy));
  gr.translate(-x, -y);
}

synchronized void grow() {
  if (Math.floor(size) != size) {
    return;
  }
  new Thread() {
  @Override
  public void run() {
    for (int i = 0; i < 5; i++) {
      size += 0.2;
      try {
        sleep(40);
      } catch (InterruptedException ex) {
      }
    }
    if (size >= 5) {
      Atom.this.yieldParticles();
      synchronized (atoms) {
        atoms.remove(new Point(x, y));
      }
    }
    size = Math.round(size);
  }
  }.start();
}

private void yieldParticles() {
  synchronized (Particle.particles) {
    Particle.particles.add(new Particle(x + 25, y + 25,
                                        Particle.Direction.UP));
    Particle.particles.add(new Particle(x + 25, y + 25,
                                        Particle.Direction.DOWN));
    Particle.particles.add(new Particle(x + 25, y + 25,
                                        Particle.Direction.LEFT));
    Particle.particles.add(new Particle(x + 25, y + 25,
                                        Particle.Direction.RIGHT));
  }
}
}
