package com.github.drinkjava2.frog.env;

import java.awt.Color;
import static java.awt.Color.*;
import java.awt.Graphics;

import javax.swing.JPanel;

import com.github.drinkjava2.frog.Frog;
import com.github.drinkjava2.frog.brain.Organ;
import com.github.drinkjava2.frog.egg.CellGroup;
import com.github.drinkjava2.frog.egg.Zone;

/**
 * BrainPicture show first frog's brain structure, for debug purpose only
 * 
 * @author Yong Zhu
 * @since 1.0
 */
@SuppressWarnings("serial")
public class BrainPicture extends JPanel {
	private float brainWidth; // real brain width
	private int brainDispWidth; // screen display width

	public BrainPicture(int x, int y, float brainWidth, int brainDispWidth) {
		super();
		this.setLayout(null);// 空布局
		this.brainDispWidth = brainDispWidth;
		this.brainWidth = brainWidth;
		this.setBounds(x, y, brainDispWidth + 1, brainDispWidth + 1);
	}

	void drawZone(Graphics g, Zone z) {
		float rate = brainDispWidth / brainWidth;
		int x = Math.round(z.x * rate);
		int y = Math.round(z.y * rate);
		int radius = Math.round(z.radius * rate);
		g.drawRect(x - radius, y - radius, radius * 2, radius * 2);
	}

	void drawCircle(Graphics g, Zone z) {
		float rate = brainDispWidth / brainWidth;
		int x = Math.round(z.x * rate);
		int y = Math.round(z.y * rate);
		g.drawArc(x - 5, y - 5, 10, 10, 0, 360);
	}

	void fillZone(Graphics g, Zone z) {
		float rate = brainDispWidth / brainWidth;
		int x = Math.round(z.x * rate);
		int y = Math.round(z.y * rate);
		int radius = Math.round(z.radius * rate);
		g.fillRect(x - radius, y - radius, radius * 2, radius * 2);
	}

	void drawLine(Graphics g, Zone z1, Zone z2) {
		float rate = brainDispWidth / brainWidth;
		int x1 = Math.round(z1.x * rate);
		int y1 = Math.round(z1.y * rate);
		int x2 = Math.round(z2.x * rate);
		int y2 = Math.round(z2.y * rate);
		g.drawLine(x1, y1, x2, y2);
	}

	void drawText(Graphics g, Zone z, String text) {
		float rate = brainDispWidth / brainWidth;
		int x = Math.round(z.x * rate);
		int y = Math.round(z.y * rate);
		g.drawString(text, x, y);
	}

	private static final Color[] rainbow = new Color[] { RED, ORANGE, YELLOW, GREEN, CYAN, BLUE, MAGENTA };
	private static int nextColor = 0;

	private static Color nextRainbowColor() {
		if (nextColor == rainbow.length)
			nextColor = 0;
		return rainbow[nextColor++];
	}

	private static Color color(float i) {
		if (i <= 1)
			return Color.RED;
		if (i <= 3)
			return Color.ORANGE;
		if (i <= 10)
			return Color.YELLOW;
		if (i <= 20)
			return Color.GREEN;
		if (i <= 50)
			return Color.CYAN;
		if (i <= 100)
			return Color.BLUE;
		return Color.MAGENTA;
	}

	public void drawBrainPicture(Frog frog) {
		if (!Application.SHOW_FIRST_FROG_BRAIN)
			return;
		Graphics g = this.getGraphics();// border
		g.setColor(Color.WHITE);
		g.fillRect(0, 0, brainDispWidth, brainDispWidth);
		g.setColor(Color.black);
		g.drawRect(0, 0, brainDispWidth, brainDispWidth);

		for (Organ organ : frog.organs) {
			g.setColor(nextRainbowColor());
			drawZone(g, organ);
			drawText(g, organ, String.valueOf(organ.type));
		}

		for (CellGroup group : frog.cellGroups) {
			if (!group.inherit)
				g.setColor(Color.lightGray); // 如果是本轮随机生成的,灰色表示
			else
				g.setColor(color(group.cellQty)); // 如果是继承的,彩虹色表示,颜色数越往后表示数量越多
			drawLine(g, group.groupInputZone, group.groupOutputZone);
			drawZone(g, group.groupInputZone);
			fillZone(g, group.groupOutputZone);
			if (group.fat > 0) {
				g.setColor(Color.BLACK);
				drawCircle(g, group.groupOutputZone); // 如果胖了,表示激活过了,下次下蛋少不了这一组
			}
		}

	}
}