/******************************************************************************
 *  Compilation:  javac Horloge.java
 *  Execution:    java Horloge
 *  Dependences: StdDraw.java
 *
 *
 ******************************************************************************/
import java.util.* ;
import java.awt.*;

public class Horloge {

    final static int TIME_STEP = 20; // millisecondes
    final static double RAYON = 1.0;
    final static double SIZE_S = 0.9*RAYON;
    final static double SIZE_M = 0.9*RAYON;
    final static double SIZE_H = 0.5*RAYON;
    final static double EP_S = 0.01;
    final static double EP_M = 0.02;
    final static double EP_H = 0.025;

    /**
    * Affiche une horloge analogique et numérique
    * L'argument soft= 0 correspond à une trotteuse qui saute de seconde en secondes
    * L'argument soft=1 correspond à une trotteuse qui tourne continument
    */
    public static void main(String[] args) {
	    StdDraw.enableDoubleBuffering();
        StdDraw.setXscale(-1.1,1.1);
        StdDraw.setYscale(-1.1,1.1);
        double hours ;
        double minutes ;
        double seconds ;
        double msecondes ;
        double angle = 0.0;
        // si on veut paramétrer
        //int soft = Integer.parseInt(args[0]);
        int soft = 1;

        while ( true ) {

	      hours = Calendar.getInstance().get(Calendar.HOUR) ;
	      minutes = Calendar.getInstance().get(Calendar.MINUTE) ;
	      seconds = Calendar.getInstance().get(Calendar.SECOND) ;
          msecondes = Calendar.getInstance().get(Calendar.MILLISECOND);

          StdDraw.clear(StdDraw.LIGHT_GRAY);
          drawRep();

          // aiguille des secondes
          drawNeedle(StdDraw.YELLOW, EP_S, SIZE_S, 6*(seconds + soft*msecondes/1000.0));

          // aiguille des minutes
          drawNeedle(StdDraw.GRAY, EP_M, SIZE_M, 6*(minutes + seconds/60.0));

          // aiguille des heures
          drawNeedle(StdDraw.WHITE, EP_H, SIZE_H, 30*(hours + minutes/60.0));

          // affichage numérique de l'heure
          String time = String.format("%2d:%02d:%02d", (int)hours, (int)minutes, (int)seconds);
          StdDraw.setPenColor(StdDraw.WHITE);
          StdDraw.text(0, -0.5, time); // position du texte laissée litérale

          // rafraichissement chaque 1000ms
          StdDraw.show();
          StdDraw.pause(TIME_STEP);
        }
    }

    /**
    * dessine une aiguille de l'Horloge
    * @param c couleur de l'aiguille
    * @param ep épaisseur de l'aiguille
    * @param longueur longueur de l'aiguille
    * @param angle position angulaire de l'aiguille, en dégrés.
    */
    public static void drawNeedle(Color c, double ep, double longueur, double angle){
      StdDraw.setPenRadius(ep);
      StdDraw.setPenColor(c);
      angle = Math.toRadians(angle);
      StdDraw.line(0, 0, longueur* Math.sin(angle), longueur* Math.cos(angle));
    }

    /**
    * trace les parties fixes de l'Horloge
    */
    public static void drawRep(){
      StdDraw.setPenRadius();

      // cercle du fond
      StdDraw.setPenColor(StdDraw.BLACK);
      StdDraw.setXscale(-1.1,1.1);
      StdDraw.setXscale(-1.1,1.1);
      StdDraw.filledCircle(0, 0, RAYON);

      // repères
      for (int i = 0; i < 60; i++) {
          double theta = Math.toRadians(i * 6);
          double size = 0.0;
          if (i%5 == 0){
              StdDraw.setPenColor(StdDraw.ORANGE);
              size = 0.05;
          } else {
              StdDraw.setPenColor(StdDraw.WHITE);
              size = 0.015;
          }

          StdDraw.filledCircle(RAYON* Math.cos(theta), RAYON* Math.sin(theta), size);
      }
    }

}
