package packApplet;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.Image;

import javax.swing.JPanel;

public class PanelSatellite extends JPanel
{
	private double angle = 0;
	private int pas = 40;
	private long sommeil = 50;
	private boolean contact = true;
	private int forme = 2; // Carré, rond
	private boolean plein = false;
	private Color couleurForme = Color.red,
				couleurFond = Color.gray,
				couleurImage = Color.black;
	private Moteur monMoteur;
	private Image monBuffer;
	private Graphics bg;
	
	public PanelSatellite()
	{
		this.setPreferredSize(new Dimension(400, 300));
		this.setVisible(true);
		this.monMoteur = new Moteur();
		this.monMoteur.start();
	}
	
	public void setSommeil (long pDelai)
	{
		this.sommeil = Math.min(Math.max(30, pDelai), 1000);
	}
	
	public long getSommeil()
	{
		return (this.sommeil);
	}
	
	public void setPas (int pQuotient)
	{
		this.pas = Math.min(Math.max(3, pQuotient), 50);
	}
	
	public int getPas()
	{
		return (this.pas);
	}
	
	public void setForme(int pVal)
	{
		this.forme = Math.min(Math.max(1, pVal), 2);
	}
	
	public int getForme()
	{
		return (this.forme);
	}
	
	public void setPlein (boolean pVal)
	{
		this.plein = pVal;
	}
	
	public boolean getPlein()
	{
		return (this.plein);
	}
	
	public void setCouleurForme (Color pCouleur)
	{
		this.couleurForme = pCouleur;
	}
	
	public void setCouleurFond (Color pCouleur)
	{
		this.couleurFond = pCouleur;
	}
	
	public void setCouleurImage (Color pCouleur)
	{
		this.couleurImage = pCouleur;
	}
	
	public void paint(Graphics g)
	{
		// Image de double buffering
		if (monBuffer == null)
		{
			this.monBuffer = createImage(250, 150);
			this.bg = monBuffer.getGraphics();
			System.out.println("Nouvelle image");

		}
		final int largForme = 30,
				largeur = monBuffer.getWidth(null), hauteur = monBuffer.getHeight(null),
				centreX = largeur / 2, centreY = hauteur / 2;
		int posX = 0, posY = 0;
		
		// Rectangle d'effacement du JPanel
		g.setColor(this.couleurFond);
		g.fillRect(0, 0, this.getWidth(), this.getHeight());
		
		
		//Rectangle d'effacement de l'image de double buffering
		bg.setColor(this.couleurImage);
		bg.fillRect(0, 0, largeur, hauteur);
		
		posX = centreX + (int)(Math.cos(angle) * largeur / 2);
		posY = centreY - (int)(Math.sin(angle) * hauteur / 2);

		bg.setColor (this.couleurForme);
		// Rayon
		bg.drawLine(centreX, centreY, posX, posY);
		
		// Forme
		if(this.plein)
		{
			switch(this.forme)
			{
			case 1:
				bg.fillRect(posX - largForme / 2, posY - largForme / 2, largForme, largForme);
				break;
			case 2:
				bg.fillOval(posX - largForme / 2, posY - largForme / 2, largForme, largForme);
				break;
			default :
				bg.drawString("?", posX, posY);
				break;
			}
		}
		else
		{
			switch(this.forme)
			{
			case 1:
				bg.drawRect(posX - largForme / 2, posY - largForme / 2, largForme, largForme);
				break;
			case 2:
				bg.drawOval(posX - largForme / 2, posY - largForme / 2, largForme, largForme);
				break;
			default :
				bg.drawString("?", posX, posY);
				break;
			}
		}
		g.drawImage(monBuffer, 30, 20, null);
	}
	
	private class Moteur extends Thread
	{

		@Override
		public void run()
		{
			while (contact)
			{
				angle += Math.PI / pas;
				while (angle > 2 * Math.PI)
				{
					angle -= 2 * Math.PI;
				}
				repaint();
				//System.out.println("bip !");
				try
				{
					Thread.sleep(sommeil);
				}
				catch(Exception e)
				{
					e.printStackTrace();
				}
			}
		}
	}
}
