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.EAxis2_placement_3d;
import jsdai.SMachining_schema.ECartesian_point;
import jsdai.SMachining_schema.ECircle;
import jsdai.SMachining_schema.EDirection;
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.Axis2_Placement_3d;
import Entidades_step.Circulo;
import Entidades_step.Direcao;
import Entidades_step.PontoCartesiano;

public class GeraCircle extends Circle_visual implements ActionListener{

	Add_direction_visual janela_eixo = new Add_direction_visual();
	Add_direction_visual janela_ref = new Add_direction_visual();
	Add_coordinate_visual janela_coordenada = new Add_coordinate_visual();
	Axis2_placement_3d_visual janela_posicao = new Axis2_placement_3d_visual();	
	
	private static double coordenadaX, coordenadaY, coordenadaZ, 
	                      eixoX, eixoY, eixoZ, refX, refY, refZ,
	                      raio;
	private List<Circulo> listaDeCirculos = new ArrayList<Circulo>();
	
	Help janela_ajuda = new Help();
	
	public void init(){
		arco_adicionar.addActionListener(this);
		arco_retornar.addActionListener(this);
		arco_ok.addActionListener(this);
		arco_ajuda.addActionListener(this);
		arco_new_posicao.addActionListener(this);
		arco_gerar_step.addActionListener(this);
		arco_salvar.addActionListener(this);
		janela_coordenada.coordenada_ok.addActionListener(this);
		janela_ref.direcao_ok.addActionListener(this);
		janela_eixo.direcao_ok.addActionListener(this);
		janela_posicao.posicao_adicionar.addActionListener(this);
		janela_posicao.posicao_ajuda.addActionListener(this);
		janela_posicao.posicao_coordenada.addActionListener(this);
		janela_posicao.posicao_eixo.addActionListener(this);
		janela_posicao.posicao_ok.addActionListener(this);
		janela_posicao.posicao_ref_direcao.addActionListener(this);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		
		Object source = e.getSource();
		if(arco_adicionar.equals(source)){
			PontoCartesiano ponto = new PontoCartesiano(coordenadaX,coordenadaY,coordenadaZ);
			Direcao eixo = new Direcao(eixoX,eixoY,eixoZ);
			Direcao ref = new Direcao(refX,refY,refZ);
			Axis2_Placement_3d posicao = new Axis2_Placement_3d(eixo, ref, ponto);
			try{
			raio = Double.parseDouble(arco_raio.getText());
			Circulo circulo = new Circulo(raio, posicao);			
			listaDeCirculos.add(circulo);
			JOptionPane.showMessageDialog(null, "       Circulo Adicionado!");
			}catch(NumberFormatException e1){
				JOptionPane.showMessageDialog(null, "      Argumentos Inválidos!");
			}
		}
		if(arco_retornar.equals(source)){
			this.setVisible(false);
		}
		if(arco_ok.equals(source)|arco_gerar_step.equals(source)){
			
			try {
				part21();
			} catch (SdaiException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			arco_txt_parte21.setEditable(false);
			listaDeCirculos.clear();
			
		}
		if(arco_ajuda.equals(source)){
			janela_ajuda.setVisible(true);
			
		}
		if(arco_new_posicao.equals(source)){
			janela_posicao.setVisible(true);			
		}		
		if(arco_salvar.equals(source)){
			
		}
		if(janela_coordenada.coordenada_ok.equals(source)){
			try{			
			coordenadaX = Double.parseDouble(janela_coordenada.coordenada_x.getText());
			coordenadaY = Double.parseDouble(janela_coordenada.coordenada_y.getText());
			coordenadaZ = 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_ref.direcao_ok.equals(source)){
			try{
			refX = Double.parseDouble(janela_ref.direcao_x.getText());
			refY = Double.parseDouble(janela_ref.direcao_y.getText());
			refZ = Double.parseDouble(janela_ref.direcao_z.getText());
			
			JOptionPane.showMessageDialog(null, "       Direção Adicionada!");
			janela_ref.setVisible(false);
			}catch(NumberFormatException e1){
				JOptionPane.showMessageDialog(null, "Os argumentos devem ser números!");
			}
		}
		if(janela_eixo.direcao_ok.equals(source)){
			try{			
			eixoX = Double.parseDouble(janela_eixo.direcao_x.getText());
			eixoY = Double.parseDouble(janela_eixo.direcao_y.getText());
			eixoZ = Double.parseDouble(janela_eixo.direcao_z.getText());
			
			JOptionPane.showMessageDialog(null, "       Direção Adicionada!");
			janela_eixo.setVisible(false);
			}catch(NumberFormatException e1){
				JOptionPane.showMessageDialog(null, "Os argumentos devem ser números!");
			}
		}
		if(janela_posicao.posicao_adicionar.equals(source)){
			janela_posicao.setVisible(false);			
		}
		if(janela_posicao.posicao_ajuda.equals(source)){
			janela_ajuda.setVisible(true);
		}
		if(janela_posicao.posicao_coordenada.equals(source)){
			janela_coordenada.setVisible(true);			
		}
		if(janela_posicao.posicao_eixo.equals(source)){
			janela_eixo.setVisible(true);
		}
		if(janela_posicao.posicao_ok.equals(source)){
			JOptionPane.showMessageDialog(null, "     Posição Adicionada!");
			janela_posicao.setVisible(false);			
		}
		if(janela_posicao.posicao_ref_direcao.equals(source)){
			janela_ref.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();				
		arco_txt_parte21.setText("");
		arco_txt_parte21.append("DATA;\n");
		
		for(Circulo circulo: listaDeCirculos){
			
			ECartesian_point point = (ECartesian_point)model.createEntityInstance(ECartesian_point.class);
			point.setName(null,"");
			A_double p = point.createCoordinates(null);
			p.addByIndex(1, circulo.getPosicao().getLocalizacao().getX());
			p.addByIndex(2, circulo.getPosicao().getLocalizacao().getY());
			p.addByIndex(3, circulo.getPosicao().getLocalizacao().getZ());
						
			EDirection eixo = (EDirection)model.createEntityInstance(EDirection.class);
			eixo.setName(null, "");
			A_double d = eixo.createDirection_ratios(null);
			d.addByIndex(1, circulo.getPosicao().getEixo().getX());
			d.addByIndex(2, circulo.getPosicao().getEixo().getY());
			d.addByIndex(3, circulo.getPosicao().getEixo().getZ());
			
			EDirection ref = (EDirection)model.createEntityInstance(EDirection.class);
			ref.setName(null, "");
			A_double d1 = ref.createDirection_ratios(null);
			d1.addByIndex(1, circulo.getPosicao().getRef().getX());
			d1.addByIndex(2, circulo.getPosicao().getRef().getY());
			d1.addByIndex(3, circulo.getPosicao().getRef().getZ());
			
			EAxis2_placement_3d posicao = (EAxis2_placement_3d)model.createEntityInstance(EAxis2_placement_3d.class);
			posicao.setName(null, "");
			posicao.setAxis(null, eixo);
			posicao.setRef_direction(null, ref);
			posicao.setLocation(null, point);
			
			ECircle circle = (ECircle)model.createEntityInstance(ECircle.class);
			circle.setName(null, "");
			circle.setPosition(null, posicao);
			circle.setRadius(null, circulo.getRaio());
			
			arco_txt_parte21.append(point.toString()+"\n");	
			arco_txt_parte21.append(eixo.toString()+"\n");
			arco_txt_parte21.append(ref.toString()+"\n");
			arco_txt_parte21.append(posicao.toString()+"\n");
			arco_txt_parte21.append(circle.toString()+"\n");
									
		}
		arco_txt_parte21.append("ENDSEC;\n" +
				"END-ISO-10303-21;\n");
		
	}

	public GeraCircle(){
		init();
	}

}
