package org.javascool.proglets.tortueLogo;
import static org.javascool.macros.Macros.*;

import java.awt.Color;

/** Définit les fonctions de la proglet qui permet de simuler la tortue logo.
 *
 @see <a href="http://fr.wikipedia.org/wiki/Logo_(langage)#Primitives_graphiques">La référence du langage logo</a>
 @see <a href="Functions.java.html">code source</a>
 @serial exclude
 */
public class Functions {
  private static final long serialVersionUID = 1L;
  // @factory
  private Functions() {}
  /** Renvoie l'instance de la proglet pour accéder à ses éléments. */
  private static Panel getPane() {
	return getProgletPane();
  }
  // Updates the turtle position and draw if required
  private static void update(double x, double y) {
	if(x < 0) {
	  x = 0;
	}
	if(x > 511) {
	  x = 511;
	}
	if(y < 0) {
	  y = 0;
	}
	if(y > 511) {
	  y = 511;
	}
	if(pen) {
	  draw((intFunctions.x,(intx, (intFunctions.y,(inty);
	}
	Functions.x = x;
	Functions.y = y;
	if (turtle_shown) {
	  getPane().show((intx,(inty,turtle_shown);
	  sleep(1);
	}
  }
  private static void draw(int x1, int x2, int y1, int y2) {
	if(Math.abs(x1 - x2> Math.abs(y1 - y2)) {
	  if(x1 < x2) {
		draw_x(x1, x2, y1, y2);
	  else if(x1 > x2) {
		draw_x(x2, x1, y2, y1);
	  }
	else {
	  if(y1 < y2) {
		draw_y(x1, x2, y1, y2);
	  else if(y1 > y2) {
		draw_y(x2, x1, y2, y1);
	  }
	}
  }
  private static void draw_x(int x1, int x2, int y1, int y2) {
	for(int x = x1; x <= x2; x++)
	  getPane().add(x, y1 + ((y2 - y1(x - x1)) (x2 - x1), pen_color);
  }
  private static void draw_y(int x1, int x2, int y1, int y2) {
	for(int y = y1; y <= y2; y++)
	  getPane().add(x1 + ((x2 - x1(y - y1)) (y2 - y1), y, pen_color);
  }
  private static double x = 0, y = 0;
  private static double a = 0;
  private static Color pen_color = Color.BLACK;
  private static boolean pen = true;
  private static boolean turtle_shown = true;

  /** Efface toutes traces du carré de salade de taille (512, 512). */
  public static void clear_all() {
	getPane().clear();
  }
  /** Retour au milieu du carré de salade, au point (256, 256). */
  public static void home() {
	update(org.javascool.proglets.tortueLogo.Panel.width / 2, org.javascool.proglets.tortueLogo.Panel.height / 2);
  }
  /** La tortue avance de n pas. */
  public static void forward(double n) {
	set_position(x + n * Math.cos(a), y + n * Math.sin(a));
  }
  /** La tortue recule de n pas. */
  public static void backward(double n) {
	forward(-n);
  }
  /** La tortue tourne de n degrés d'angle vers la gauche. */
  public static void leftward(double n) {
	a -= Math.PI / 180.0 * n;
  }
  /** La tortue tourne de n degrés d'angle vers la droite. */
  public static void rightward(double n) {
	leftward(-n);
  }
  /** Fixe la position absolue de la tortue dans le carré de salade. */
  public static void set_position(double x, double y) {
	updatex, y);
  }
  /** Fixe le cap de la tortue de maniere absolue, selon l'angle de a degrés. */
  public static void set_heading(double a) {
	Functions.a = Math.PI / 180.0 * a;
  }
  /** La tortue ne laisse pas de trace. */
  public static void pen_up() {
	pen = false;
  }
  /** La tortue laisse sa trace (par défaut). */
  public static void pen_down() {
	pen = true;
  }
  /** Change la couleur du fond, n est un entier positif entre 0 et 9.
   @param n : 0 (noir), 1 (brun), 2 (rouge), 3 (orange), 4 (jaune), 5 (vert), 6 (bleu), 7 (violet), 8 (gris), 9 (blanc).
   */
  public static void set_background(int n) {
	getPane().setBackground(colors[n < || n > : n]);
  }
  /** Change la couleur du crayon, n est un entier positif entre 0 et 9.
   @param n : 0 (noir), 1 (brun), 2 (rouge), 3 (orange), 4 (jaune), 5 (vert), 6 (bleu), 7 (violet), 8 (gris), 9 (blanc).
   */
  public static void set_color(int n) {
	pen_color = colors[n < || n > : n];
  }
  private static Color colors[] Color.BLACK, new Color(150750), Color.RED, Color.ORANGE, Color.YELLOW, Color.GREEN, Color.BLUE, Color.MAGENTA, Color.GRAY, Color.WHITE };
  public static void show_turtle() {
	turtle_shown = true;
	getPane().show((intx,(inty,turtle_shown);
  }
  public static void hide_turtle() {
	turtle_shown = false;
	getPane().show((intx,(inty,turtle_shown);
  }

}