package automatvgi.widgets;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import automatvgi.LatexColor;

public class ColorSelector2 extends JFrame implements MouseListener,ChangeListener,ActionListener{

	private static final long serialVersionUID = 1L;
	private static int n=1;
	private Color selected=Color.BLACK;
	private ColorSetter p;
	private JSlider js;
	private int ref=0;
	private JTextField name;
	public ColorSelector2(ColorSetter p){
		this.p=p;
		JPanel jp=new JPanel();
		jp.setLayout(new BorderLayout(3,1));
		js=new JSlider(0,255*3,255);
		js.addChangeListener(this);
		jp.add(js,BorderLayout.NORTH);
		jp.add(new Cible(),BorderLayout.CENTER);
		JPanel bottom=new JPanel();
		name=new JTextField("UserColor"+n++,40);
		bottom.add(name);
		JButton jb=new JButton("OK");
		jb.addActionListener(this);
		bottom.add(jb);
		jp.add(bottom,BorderLayout.SOUTH);
		//jr= new JPanel
		setContentPane(jp);
		pack();
		setVisible(true);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		new ColorSelector2(null);
	}

	private Color getColor(int x, int y){
		double h=2*ref,k=ref;
		double[] r=new double[3];
		r[0]=y/h; r[1]=(-x/k-y/h+1)/2; r[2]=(x/k-y/h+1)/2;
		for(int i=0; i<3; i++)
			if(r[i]<0 || r[i]>1) return null;
		int[] c=new int[3];
		for(int i=0;i<3; i++)
			c[i]=0;
		int intensite=js.getValue();
		//do{
			for(int i=0;i<3; i++)
			 c[i]+=Math.min(255-c[i],(int)(r[i]*intensite)) ;
			
			for(int i=0;i<3; i++)
				 intensite-=c[i] ;
			boolean flag=intensite>2;
			for(int i=0; flag && i<3; i++)
				if(c[i]==255 && c[(i+1)%3]==255){
					c[(i+2)%3]+=intensite;
					intensite=0;
				}
			flag=intensite>2;
			for(int i=0;i<3 && flag; i++){
				if(c[i]==255){
					flag=false;
					double rs=r[(i+1)%3]+r[(i+2)%3];
					if(rs==0){
						r[(i+1)%3]=r[(i+2)%3]=.5;
					}else{
						r[(i+1)%3]/=rs; r[(i+2)%3]/=rs;
					}
					int[] d= new int[3];
					for(int j=i+1; j<=i+2;j++){
						d[j%3]=Math.min(255-c[j%3],(int)(r[j%3]*intensite)) ;
						c[j%3]+=d[j%3];
					}
					intensite-=d[(i+1)%3]+d[(i+2)%3];
					if(intensite<0) System.out.println(intensite+"--"+r[(i+1)%3]+r[(i+2)%3]);
					if(c[(i+1)%3]==255) c[(i+2)%3]+=intensite;
					else if(c[(i+2)%3]==255)c[(i+1)%3]+=intensite;
				}	
			}
		try{
			return new Color(c[0],c[1],c[2]);
		}catch(IllegalArgumentException e){
			System.out.println(""+c[0]+","+c[1]+","+c[2]);
		}
		return null;
	}

	private class Cible extends JPanel{

		private static final long serialVersionUID = 1L;		
		
		public Cible(){
			setPreferredSize(new Dimension(512,512));
			addMouseListener(ColorSelector2.this);
		}
		
				@Override
		public void paintComponent(Graphics gr){
			ref=Math.min(getWidth(), getHeight())*2/5;
			gr.setColor(selected);
			gr.fillRect(0, 0, getWidth(), getHeight());
			for(int y=0; y<=2*ref; y++){
				for(int x=-ref+y/2;x<=ref-y/2;x++){
					Color c=getColor(x,y);
					if(c!=null){
						gr.setColor(getColor(x,y));
						gr.fillRect(getWidth()/2+x,y,1,1);
					}
				}
			}
		}
	}

	public void mouseClicked(MouseEvent e) {
		int x=e.getX()-getWidth()/2, y=e.getY();
		if(y<=2*ref && x>=-ref+y/2 && x<=ref-y/2){
			selected=getColor(x,y);
			repaint();
		}
	}

	public void mouseEntered(MouseEvent e) {
		//nothing
	}

	public void mouseExited(MouseEvent e) {
		//nothing
	}

	public void mousePressed(MouseEvent e) {
	}

	public void mouseReleased(MouseEvent e) {
	}

	public void stateChanged(ChangeEvent e) {
		repaint();
	}

	public void actionPerformed(ActionEvent arg0) {
		if(p!=null){
			p.setColor(new LatexColor(name.getText(),selected));
		}
		dispose();
	}
}
	
	
