import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;

import jsdai.SMachining_schema.ECartesian_point;
import jsdai.SMachining_schema.EDirection;
import jsdai.SMachining_schema.ELine;
import jsdai.SMachining_schema.EVector;
import jsdai.SMachining_schema.SMachining_schema;
import jsdai.lang.A_double;
import jsdai.lang.SdaiException;
import jsdai.lang.SdaiModel;
import jsdai.lang.SdaiRepository;
import jsdai.lang.SdaiSession;

import Entidades_step.Direcao;
import Entidades_step.PontoCartesiano;
import Entidades_step.Reta;
import Entidades_step.Vector;


public class GeraLine extends Line_visual implements ActionListener{

	private static double X, Y, Z, X1, Y1, Z1,mag;
	Add_coordinate_visual janela_coordenada = new Add_coordinate_visual();
	Add_direction_visual janela_direcao = new Add_direction_visual();
	Vector_visual janela_vetor = new Vector_visual();
	Help janela_ajuda = new Help();	
	
	private List<Reta> listaDeRetas = new ArrayList<Reta>();  
	
	public void init(){
		reta_retornar.addActionListener(this);
		reta_ok.addActionListener(this);
		reta_adicionar.addActionListener(this);
		reta_gera_step.addActionListener(this);
		reta_ajuda.addActionListener(this);
		reta_salvar_parte21.addActionListener(this);
		reta_new_vetor.addActionListener(this);
		reta_new_coordenada.addActionListener(this);		
		janela_coordenada.coordenada_ok.addActionListener(this);
		janela_direcao.direcao_ok.addActionListener(this);
		janela_vetor.vetor_adicionar.addActionListener(this);
		janela_vetor.vetor_ajuda.addActionListener(this);
		janela_vetor.vetor_direcao.addActionListener(this);
		janela_vetor.vetor_ok.addActionListener(this);
	}
		
	@Override
	public void actionPerformed(ActionEvent e) {
		Object source = e.getSource();
		if(reta_retornar.equals(source)){
			this.setVisible(false);
		}
		if(reta_new_coordenada.equals(source)){			
			janela_coordenada.setVisible(true);
		}
		if(reta_new_vetor.equals(source)){
			janela_vetor.setVisible(true);
		}
		if(janela_vetor.vetor_adicionar.equals(source)|janela_vetor.vetor_ok.equals(source)){
			try{
			mag = Double.parseDouble(janela_vetor.vetor_mag.getText());
			JOptionPane.showMessageDialog(null, "        Vetor Adicionado!");
			janela_vetor.setVisible(false);
			}catch(NumberFormatException e1){
				JOptionPane.showMessageDialog(null, "Os argumentos devem ser números!");
			}
		}
		if(janela_vetor.vetor_direcao.equals(source)){			
			janela_direcao.setVisible(true);
		}
		if(janela_coordenada.coordenada_ok.equals(source)){
			try{			
			X = Double.parseDouble(janela_coordenada.coordenada_x.getText());
			Y = Double.parseDouble(janela_coordenada.coordenada_y.getText());
			Z = Double.parseDouble(janela_coordenada.coordenada_z.getText());
			
			JOptionPane.showMessageDialog(null, "   Coordenada Adicionada!");
			janela_coordenada.setVisible(false);
			}catch(NumberFormatException e1){
				JOptionPane.showMessageDialog(null, "Os argumentos devem ser números!");
			}
		}
		if(janela_direcao.direcao_ok.equals(source)){
			try{			
			X1 = Double.parseDouble(janela_direcao.direcao_x.getText());
			Y1= Double.parseDouble(janela_direcao.direcao_y.getText());
			Z1 = Double.parseDouble(janela_direcao.direcao_z.getText());
			
			JOptionPane.showMessageDialog(null, "       Direção Adicionada!");
			janela_direcao.setVisible(false);
			}catch(NumberFormatException e1){
				JOptionPane.showMessageDialog(null, "Os argumentos devem ser números!");
			}
		}		
		if(reta_adicionar.equals(source)){
			PontoCartesiano ponto = new PontoCartesiano(X,Y,Z);
			Direcao direcao = new Direcao(X1,Y1,Z1);
			Vector vector = new Vector(mag,direcao);
			Reta reta = new Reta(ponto, vector);
			listaDeRetas.add(reta);
			JOptionPane.showMessageDialog(null, "        Reta Adicionada!");
		}
		if(reta_ok.equals(source)){
			try {
				part21();
			} catch (SdaiException e1) {
				e1.printStackTrace();
			}
			reta_txt_parte21.setEditable(false);
			listaDeRetas.clear();
		}
		if(reta_salvar_parte21.equals(source)){
			
		}	
		if(reta_ajuda.equals(source)|janela_vetor.vetor_ajuda.equals(source)){
			janela_ajuda.setVisible(true);
		}
	}
	private void part21() throws SdaiException{
		
		SdaiSession session = SdaiSession.openSession();
		session.startTransactionReadWriteAccess();
		SdaiRepository repository = session.createRepository("", null);
		repository.openRepository();
		SdaiModel model = repository.createSdaiModel("DemoSTEP_NC", SMachining_schema.class);
		model.startReadWriteAccess();		
		reta_txt_parte21.setText("");
		reta_txt_parte21.append("DATA;\n");
		
		for(Reta reta : listaDeRetas){
			
			ECartesian_point point = (ECartesian_point)model.createEntityInstance(ECartesian_point.class);
			point.setName(null,"");
			A_double p = point.createCoordinates(null);
			p.addByIndex(1, reta.getPonto().getX());
			p.addByIndex(2, reta.getPonto().getY());
			p.addByIndex(3, reta.getPonto().getZ());
			
			EDirection direction = (EDirection)model.createEntityInstance(EDirection.class);
			A_double d = direction.createDirection_ratios(null);
			d.addByIndex(1, reta.getDirecao().getOrientation().getX());
			d.addByIndex(2, reta.getDirecao().getOrientation().getY());
			d.addByIndex(3, reta.getDirecao().getOrientation().getZ());
			
			EVector vector1 = (EVector)model.createEntityInstance(EVector.class);
			vector1.setName(null, "");
			vector1.setOrientation(null, direction);
			vector1.setMagnitude(null, reta.getDirecao().getMagnitude());
						
			ELine line = (ELine)model.createEntityInstance(ELine.class);
			line.setName(null,"");
			line.setPnt(null, point);
			line.setDir(null, vector1);	
			
			reta_txt_parte21.append(point.toString()+"\n");
			reta_txt_parte21.append(direction.toString()+"\n");
			reta_txt_parte21.append(vector1.toString()+"\n");
			reta_txt_parte21.append(line.toString()+"\n");
									
		}
		reta_txt_parte21.append("ENDSEC;\n" +
				"END-ISO-10303-21;\n");
	}
		
	public GeraLine(){
		init();
	}

}
