/*
 * Created on Jan 24, 2005
 */
package uk.co.zonetora.emergence.ants;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;

/**
 * @author tora
 */
public class AntPanel extends Canvas implements IWorldUpate {

    /**
     * Comment for <code>serialVersionUID</code>
     */
    private static final long serialVersionUID = 1L;

    private BufferStrategy bs;

    private final int SIZE = 2;

    private final AntKernel ak;

    public AntPanel() {
        this.ak = new AntKernel(this);
        setSize(ak.getWidth() * SIZE, ak.getHeight() * SIZE);
    }

    public void stop() {
        ak.stop();
    }

    public void start() {
        createBufferStrategy(2);
        bs = getBufferStrategy();
        Thread t = new Thread(ak);
        t.start();
    }

    public void worldUpate(int[][][] world, double[][] pher, long tick) {

        if (/* tick % 100 != 0 || */bs == null) {
            return;
        }

        Graphics2D g;
        try {
            g = (Graphics2D) bs.getDrawGraphics();
        } catch (NullPointerException npe) {
            return;
        }
        
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, getWidth(), getHeight());

        for (int i = 0; i < world[AntKernel.FOOD].length; i++) {
            for (int j = 0; j < world[AntKernel.FOOD][i].length; j++) {

                int fd = world[AntKernel.FOOD][i][j];
                int fwd = world[AntKernel.FWD_ANTS][i][j];
                int bk = world[AntKernel.BK_ANTS][i][j];
                double ph = pher[i][j];

                if (fd == 0 && fwd == 0 && bk == 0 && ph == 0) {
                    continue;
                }

                int numAnts = fwd + bk;
                fd += bk;

                float blue = (float) numAnts / (float) AntKernel.MAX_ANTS;
                float red = (float) (ph / AntKernel.MAX_PHER);
                float green = (float) fd / (float) AntKernel.MAX_FOOD;

                if (blue > 0) {
                    blue += 0.5f;
                }
                if (green > 0) {
                    green += 0.2f;
                }
                if (red > 0) {
                    red += 0.1f;
                }

                if (blue < 0) {
                    blue = 0.0f;
                }
                if (green < 0) {
                    green = 0.0f;
                }
                if (red < 0) {
                    red = 0.0f;
                }

                if (blue >= 1.0f) {
                    blue = 1.0f;
                }
                if (red >= 1.0f) {
                    red = 1.0f;
                }
                if (green >= 1.0f) {
                    green = 1.0f;
                }
                try {
                    g.setColor(new Color(red, green, blue));
                } catch (IllegalArgumentException e) {
                    throw new IllegalArgumentException("b " + blue + " r "
                            + red + " g " + green);
                }
                g.drawRect(i * SIZE, j * SIZE, SIZE - 1, SIZE - 1);
            }
        }

        bs.show();
        g.dispose();
    }

    public void paint() {
        // do nothing
    }

}
