package automatvgi;


import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

import road.PeriodicException;
import road.action.Flip;
import road.action.RoadAction;
import road.action.StablePairAction;
import road.tools.StablePair;

import automatvgi.components.RoadAutomaton;



/**
 * 
 * @author sylvain
 * Fenetre principale
 * Contient
 * -- le dessin principal au CENTRE : Dessin
 * -- la liste des actions au SUD : ChoiceOfAction
 */

public class MainPanel extends JPanel{
	static final long serialVersionUID=1;
	private ChoiceOfAction ca=new ChoiceOfAction(this);
	private JTextField fd=new JTextField(4);
	private JComboBox jcb= null;
	private RoadAutomaton ra;
	private Dessin s=new Dessin();
	private InitPanel ip; // ajoute beal

	private JFrame pf=new JFrame();
	
	public RoadAutomaton getRA() {
		return ra;
	}
	
	
	public MainPanel(){
		setLayout(new BorderLayout());	
		fd.setText("p");
		pf.setResizable(false);
		pf.setTitle("Action");
		String[] git={"a","b","c"};
		jcb= new JComboBox(git);
		add(ca,BorderLayout.SOUTH);
		

		
		//Graphics g=s.getGraphics();
		//g.drawLine(0,0,100,100);
		s.setAlphabet(jcb);
		s.setStateLabel(fd);
		s.setActions(ca);
		add(s,BorderLayout.CENTER);
	}
	// ip is the panel of the initial graph
	public MainPanel(RoadAutomaton ra, InitPanel ip){
		this.ra = ra;
		this.setIP(ip);
		s = new Dessin(ra.getQuo());
		setLayout(new BorderLayout());	
		fd.setText("p");
		pf.setResizable(false);
		pf.setTitle("Action");
		String[] git={"a","b","c"};
		jcb= new JComboBox(git);
		add(ca,BorderLayout.SOUTH);
		//add(ba,BorderLayout.SOUTH);
		
		//Graphics g=s.getGraphics();
		//g.drawLine(0,0,100,100);
		s.setAlphabet(jcb);
		s.setStateLabel(fd);
		s.setActions(ca);
		add(s,BorderLayout.CENTER);
	}
	

	
         
	private void showFlip(Flip flip) {
		ra.doMemoryFlip(flip);
		ra.updateTransitionComponents();
		RoadAutomaton.getInitialGraph().doMemoryFlip(flip);
		RoadAutomaton.getInitialGraph().updateTransitionComponents();
		ip.repaint();
		repaint();
	}
	
	private void showStablePair(StablePairAction spa) {
		int s1 = spa.getS1();
		int s2 = spa.getS2();
		ra.getQuo().lightState(s1,LatexColor.getColorByName("Apricot"));
		ra.getQuo().lightState(s2,LatexColor.getColorByName("Apricot"));
		RoadAutomaton.getInitialGraph().getQuo().lightState(s1,LatexColor.getColorByName("Apricot"));
		RoadAutomaton.getInitialGraph().getQuo().lightState(s2,LatexColor.getColorByName("Apricot"));
		ip.repaint();
		repaint();
	}
	
	private void showQuotient(StablePairAction spa) {
		ra.getQ().emptyActionList();
		ra.getQ().upLiftFlips();
		System.out.print("MainPanel:showQuotient:"); System.out.println("uplift done");
		int s1 = spa.getS1();
		int s2 = spa.getS2();
		ra.getQ().merge(s1,s2);
		ra.getQ().update();
		ra.updateRoadAutomaton();
		RoadAutomaton.getInitialGraph().updateEdgesMemory();
		RoadAutomaton.getInitialGraph().getQuo().lightState(s1,LatexColor.getColorByName("White"));
		RoadAutomaton.getInitialGraph().getQuo().lightState(s2,LatexColor.getColorByName("White"));
		RoadAutomaton.getInitialGraph().updateTransitionComponents();
	    s.setAutomaton(ra.getQuo());
	    ip.getInitDessin().setAutomaton(RoadAutomaton.getInitialGraph().getQuo());
	    repaint();	
	}
	
	private void doAction(RoadAction rac) {
		System.out.print("doAction:");System.out.println(ra.getQ().getActionList());
		if (rac instanceof Flip) {
			   showFlip((Flip)rac);
			   System.out.print("doAction:showFlip");System.out.println(rac);
			   ra.getQ().getActionList().removeFirst();
			} 
		if (rac instanceof StablePairAction) {
			if (((StablePairAction) rac).getBool()== false) {
				showStablePair((StablePairAction)rac);
				((StablePairAction) rac).setBool(true);
			} else {
				showQuotient((StablePairAction)rac);		
			}
		}
	}
	
	public void actionPerformed(ActionEvent e){
		if (e.getSource()==ca.button) {
			try {
				if (ra.getQ().size()==1) {
					System.out.println("finished");
				} else {
					if (ra.getQ().getActionList().size() == 0) {
						ra.getQ().emptyActionList();
						ra.getQ().update();
						StablePair stable = ra.getQ().findStablePair();
						RoadAction rac = ra.getQ().getActionList().getFirst();
						doAction(rac);
					} else {
						RoadAction rac = ra.getQ().getActionList().getFirst();
						doAction(rac);
					}
				}
			} catch (PeriodicException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
		if(e.getSource()==ca.transition){
		pf.setContentPane(jcb);
		pf.setSize(50,50);
        pf.setVisible(true);
		}
		else if(e.getSource()==ca.state){
			pf.setContentPane(fd);
			pf.setSize(50,50);
			pf.setVisible(true);
		}else{
			pf.setVisible(false);
			repaint();
		}
	}


	public void setIP(InitPanel ip) {
		this.ip = ip;
	}


	public InitPanel getIP() {
		return ip;
	}
	

	
}
