import java.awt.event.*;
import java.awt.*;
import java.io.*;
import javax.swing.*;

/**
 * Clase MenuProgramaCompilar
 * Permite guardar el programa y generar el codigo para enviar al robot.
 * @author Patricio A. Castillo Pizarro - Eric C. Maldonado Olguin
 * @version 1.7 - Jun 25th, 2007
 */
class MenuProgramaCompilar implements MouseListener
{
    private EditorPanel panel;
    private JTextArea textA1;
    private JTextArea textA2;;

    /**
     * Constructor.
     * @param p Panel en que se encuentra el programa grafico a compilar
     */
    public MenuProgramaCompilar(EditorPanel p,JTextArea A1,JTextArea A2)
    {
         panel = p;
         textA1=A1;
         textA2=A2;
    }

    /**
     *Metodo que define las acciones a realizar al presiona el boton del mouse
     *@param event Parametro que indica la accion realizada por el mouse
     */
    public void mousePressed(MouseEvent event){
        //Primero se verifica que este presente el compilador
        String compiler = new String();
        String sls = new String(System.getProperty("file.separator"));
        try{
            String path = new File(".").getCanonicalPath();
            compiler = path+sls+"nqc.exe";
            if (!new File(compiler).exists()){
                JOptionPane.showMessageDialog(null,
                        "No se encuentra el programa interfaz.\nAsegurese que "
                        +"\"nqc.exe\" se encuentra en la ruta desde la que se "
                        +"esta ejecutando esta aplicacion:\n"+path+"\nSolo se "
                        +"creara el archivo \".nqc\".",
                        "Advertencia", JOptionPane.WARNING_MESSAGE);
            }
        }catch (IOException e) {
            e.printStackTrace();
        }

        //Este codigo permite escoger el archivo
        JFileChooser fcSave = new JFileChooser();
        fcSave.setSelectedFile(new File("*.nqc"));
        fcSave.setFileFilter(new FileFilterNQC());
        int return_fcSave = fcSave.showSaveDialog(null);

        //Este codigo permite grabar el codigo en el archivo ".nqc"
        //y luego compilarlo en un archivo del mismo nombre ".rcx".
        File fileToSave = fcSave.getSelectedFile();
        if (return_fcSave == JFileChooser.APPROVE_OPTION) {

            //Se graba el archivo ".nqc".
            try {
                BufferedWriter salida =new BufferedWriter(
                        new FileWriter(fileToSave.getAbsolutePath()));
                salida.write("  //Programa Creado Con Lego JEP\n\n  " +
                        "task main(){\n  ");
                Point temp[] = new Point[10];
                int number = 0;
                int pos = 200;
                int max[] = new int[10];
                panel.panelNQC = new String();
                panel.panelNQC = panel.panelNQC + "  Codigo NQC para su programa: " +
                        panel.nombrePrograma + "\n\n  task main(){\n  ";
                for (int i=50; i < panel.getHeight(); i=i+50) {
                    if (panel.find(new Point(pos,i)) != null) {
                        salida.append(
                                panel.find(new Point(pos,i)).getProgram()+
                                "\n  ");
                        panel.panelNQC = panel.panelNQC +
                                panel.find(new Point(pos,i)).getProgram()+"\n  ";
                        String data = panel.find(new Point(pos,i)).getData();
                        if (data.substring(0,
                                data.indexOf("---")).equals("SiNo")){
                            temp[number] = new Point(i,1);
                            pos = pos - 50;
                            number++;
                        }
                    } else {
                        if(number > 0){
                            if (temp[number-1].getY() == 1){
                                max[number-1] = i;
                                i = (int)temp[number-1].getX();
                                pos = pos + 100;
                                temp[number-1].setLocation(i,0);
                                salida.append("} else {\n  ");
                                panel.panelNQC = panel.panelNQC + "} else {\n  ";
                            } else {
                                if (i < max[number-1])
                                    i = max[number-1]-50;
                                pos = pos - 50;
                                number--;
                                salida.append("}\n  ");
                                panel.panelNQC = panel.panelNQC + "\n  ";
                            }
                        }
                    }
                }
                panel.panelNQC = panel.panelNQC + "}";
               textA1.setText(panel.panelNQC);
                salida.append("}");
                salida.close();
            } catch (IOException e) {
                System.out.println("No se puede escribir el archivo");
                JOptionPane.showMessageDialog(null,
                        "No se puede escribir el archivo.",
                        "Error", JOptionPane.ERROR_MESSAGE);
            }

            //Finalmente se compila el archivo ".rcx"
            if (new File(compiler).exists()) {
                String nqcfile = new String(fileToSave.getName());
                String rcxfile = new String();
                int i = nqcfile.lastIndexOf(".");
                if ((i>0)&&(i<nqcfile.length()-1)) {
                    if (nqcfile.substring(i+1).toLowerCase().compareTo("nqc")
                    ==0)
                        rcxfile = nqcfile.substring(0,i)+".rcx";
                    else
                        rcxfile = nqcfile+".rcx";
                }
                else
                    rcxfile = nqcfile+".rcx";
                String command ="\""+compiler+"\" -T"+panel.tipo+" -O\""+
                        fileToSave.getParent()+sls+rcxfile+"\" -E -l \""+
                        fileToSave+"\"";
                Runtime run = Runtime.getRuntime();
                try{
                    String line;
                    panel.panelOUT = new String();
                    BufferedReader input = new BufferedReader(
                            new InputStreamReader(
                            run.exec(command).getInputStream()));
                    while ((line = input.readLine()) != null) {
                        System.out.println(line);
                        panel.panelOUT = panel.panelOUT + "\n  " +line;
                    }
                    textA2.setText(panel.panelOUT);
                    input.close();
                } catch (Exception e){
                    System.out.println("No se pueden compilar los datos");
                    JOptionPane.showMessageDialog(null,
                            "No se pueden compilar los datos." +
                            "\nVerifique el programa de interfaz.",
                            "Error", JOptionPane.ERROR_MESSAGE);
                }
            }

            //se almacena la ruta del archivo en que se guardo el programa
            panel.archivoGuardado = fileToSave;

        }else{
            JOptionPane.showMessageDialog(null,
                    "Ningun archivo seleccionado.\nNo se grabo el programa.",
                    "Advertencia", JOptionPane.WARNING_MESSAGE);
        }
    }

    /**
     *Implementacion de MouseListener cuando el boton del mouse hace click
     */
    public void mouseClicked(MouseEvent event){}

    /**
     *Implementacion de MouseListener cuando el boton del mouse se libera
     */
    public void mouseReleased(MouseEvent event){}

    /**
     *Implementacion de MouseListener cuando el mouse ingresa a un componente
     */
    public void mouseEntered(MouseEvent event){}

    /**
     *Implementacion de MouseListener cuando el mouse sale de un componente
     */
    public void mouseExited(MouseEvent event){}
}
//Fin clase MenuProgramaCompilar