package dibujo;

import algoritmobr.vertice;
import base.Grafo;
import gestion.AbrirArchivo;
import gestion.GuardarArchivo;
import gestion.NuevoDocumento;
import interfaz.Interfaz;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;
import java.beans.PropertyVetoException;
import java.io.File;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import interfaz.Interfaz;
import java.awt.Dimension;
import java.awt.Toolkit;

public class AreaDibujo extends Container implements MouseListener, MouseMotionListener, ActionListener {

    public static Punto[] puntos;
    public static Punto[] puntocopy;
    public static Punto[] puntocopy2;
    public static Arista[] aristas;
    public static Arista[] aristascopy;
    public static Arista[] aristascopy2;
    public static int totalpuntocopy2;
    public static int totalaristascopy2;
    public static String gradoEntrada = "0";
    public static String gradoSalida = "0";
    public int[] vectorColorear;
    public Color vectorseleccolor[];
    public static int contadorselec = 0;
    public static int contadorarista = 0;
    public int vectorselec[];
    public int vectorarista[];
    public int tempv[];
    public Grafo grafo;
    final int MAX_PUNTOS = 100;
    final int MAX_ARISTAS = 900;
    public static int a = -1;
    public static int indiceAristas;
    public static int indicePuntos;
    public static Lienzo lienzo;
    public static Lienzo lienzocopy;
    private Punto puntoAux[];
    private int x, y;
    private int contador;
    private Punto movible;
    private boolean flag;
    public static int corX_presionado, corY_presionado;
    public static int corX, corY;
    public static int X, Y;
    public static int estaContenido;
    public static int estaarista;
    public static int aux;
    ;
    public boolean moverpuntos;
    public boolean repetitivo = false;
    private GuardarArchivo guardar;
    private AbrirArchivo abrir;
    private NuevoDocumento nuevo;
    public static int matrizAdyacencia[][];
    // Menu del Lienzo Contextual
    public static JPopupMenu MenuLienzo = new JPopupMenu();
    public static JMenuItem agregararista = new JMenuItem("Agregar Arista");
    public static JMenuItem agregarnodo = new JMenuItem("Agregar Nodo");
    public static JMenuItem Etiqueta = new JMenuItem("Cambiar Etiqueta del Nodo");
    //----------------------------------------------------------------------------
    public static Color FullColor;
    public static int valor = -1;
    public static int valorArista = -1;
    public static int AristaoPunto = -1;
    private int Px = 0;
    private int Py = 0;

    public AreaDibujo() {

        matrizAdyacencia = new int[MAX_PUNTOS][MAX_PUNTOS];
        puntos = new Punto[10];
        puntocopy = new Punto[10];
        puntocopy2 = new Punto[10];
        vectorselec = new int[10];
        vectorarista = new int[90];
        tempv = new int[10];
        vectorseleccolor = new Color[10];
        aristas = new Arista[90];
        aristascopy = new Arista[90];
        aristascopy2 = new Arista[90];
        grafo = new Grafo();
        indiceAristas = -1;
        indicePuntos = -1;
        lienzo = new Lienzo();
        lienzocopy = new Lienzo();
        lienzo.setBounds(0, 0, 1366, 768);
        this.setLayout(null);
        this.add(lienzo);
        lienzo.setBackground(Color.WHITE);
        this.setBackground(Color.WHITE);
        lienzo.addMouseListener(this);
        lienzo.addMouseMotionListener(this);
        //----------------------*****Menu del Lienzo Contextual*****----------------------     
        
        agregarnodo.setSize(15, 15);
        Etiqueta.setSize(15, 15);
        agregararista.setSize(15, 15);
        MenuLienzo.setSize(20, 10);
        MenuLienzo.getLocale();
        MenuLienzo.addSeparator();
        MenuLienzo.add(agregarnodo);
        MenuLienzo.add(Etiqueta);
        MenuLienzo.addSeparator();
        MenuLienzo.add(agregararista);
        MenuLienzo.addSeparator();
        MenuLienzo.addMouseListener(this);
        agregarnodo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/esfera16.png")));
        Etiqueta.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/texto16.png")));
        agregararista.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/esfera316.png")));
       

        agregarnodo.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                agregarnodo(X, Y);
            }
        });

        //llama a la Funcion para cambiar etiqueta del nodo
        Etiqueta.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                cambiaretiqueta();
            }
        });


        //-----------------------------------------------

        agregararista.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Interfaz.aristaNueva.setSelected(true);
                Interfaz.BarAgregaArista.setEnabled(true);
                if (!Interfaz.aristaNueva.isEnabled()) {
                    Interfaz.BarAgregaArista.setEnabled(false);
                    Interfaz.aristaNueva.setEnabled(false);
                }

            }
        });

        //----------------------*****Menu*****----------------------        
        puntoAux = new Punto[2];
        contador = 0;
        flag = false;
        repetitivo = false;
        guardar = new GuardarArchivo(this);
        abrir = new AbrirArchivo(this);
        nuevo = new NuevoDocumento(this);

    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if ((Interfaz.nodoNuevo.isSelected() == true || Interfaz.nodoNuevo1.isSelected() == true) && indicePuntos >= MAX_PUNTOS - 1 && e.isMetaDown() == false) {
            JOptionPane.showMessageDialog(null, "No se puede Crear más Nodos\n" + "Se ha alcanzado el Limite");
            Interfaz.modificar.setSelected(true);
        }

        if (Interfaz.nodoNuevo.isSelected() == true && indicePuntos < MAX_PUNTOS - 1 && e.isMetaDown() == false) {
            agregarnodo(e.getX() - 5, e.getY() - 5);
        }
        
        if(Interfaz.nodoNuevo1.isSelected() == true && indicePuntos < MAX_PUNTOS - 1 && e.isMetaDown() == false){
            agregarnodo(e.getX() - 5, e.getY() - 5);
        }

        if (Interfaz.cambiarEtiqueta.isSelected() == true && e.isMetaDown() == false) {

            for (int i = 0; i <= indicePuntos; i++) {
                if (puntos[i].estaContenido(new Point(e.getX() - 5, e.getY() - 5)) == true) {
                    repetitivo = false;
                  
                    String oracion = JOptionPane.showInputDialog("ETIQUETA");
                    if (oracion != null) {
                        puntos[i].setEtiqueta(oracion);
                    }

                    lienzo.repaint();
                }
            }
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {
        contador = 0;
        estaContenido = 1;
        moverpuntos = false;

        if (Interfaz.aristaNueva.isSelected() == true && e.isMetaDown() == false && e.isMetaDown() == false) {
            for (int i = 0; i <= indicePuntos; i++) {
                if (puntos[i].estaContenido(new Point(e.getX() - 5, e.getY() - 5)) == true) {
                    x = puntos[i].getPosicion().x;
                    y = puntos[i].getPosicion().y;
                    puntoAux[0] = puntos[i];
                    contador++;
                    break;
                }
            }
        }
    }

    @Override
    @SuppressWarnings("empty-statement")
    public void mouseReleased(MouseEvent e) {
        aux = 0;



        //Menu Lienzo contextual
        if (MenuLienzo.isPopupTrigger(e) && Interfaz.modificar.isSelected() == true) {
            aux = 1;
            a = -1;
            Etiqueta.setFont(new java.awt.Font("Segoe UI", 0, 12));
            Etiqueta.setEnabled(false);
            agregarnodo.setFont(new java.awt.Font("Segoe UI", 1, 12));
            agregarnodo.setEnabled(true);
            agregararista.setFont(new java.awt.Font("Segoe UI", 0, 12));
            agregararista.setEnabled(false);
            X = e.getX() - 5;
            Y = e.getY() - 5;
            if (contadorselec == 0) {
                int temp = 0;
                for (int i = 0; i <= indicePuntos; i++) {
                    if (puntos[i].estaContenido(new Point(e.getX() - 5, e.getY() - 5)) == true) {
                        X = e.getX() - 5;
                        Y = e.getY() - 5;
                        agregararista.setFont(new java.awt.Font("Segoe UI", 1, 12));
                        agregararista.setEnabled(true);
                        agregarnodo.setFont(new java.awt.Font("Segoe UI", 0, 12));
                        agregarnodo.setEnabled(false);
                        Etiqueta.setFont(new java.awt.Font("Segoe UI", 1, 12));
                        Etiqueta.setEnabled(true);
                        Px = e.getX() + 6;
                        Py = e.getY() + 25;
                        valor = i;
                        temp = 1;
                        i = indicePuntos;
                    }
                }
            }
            MenuLienzo.show(Interfaz.frameDibujo, e.getX() + 6, e.getY() + 25);
            MenuLienzo.setVisible(true);
        }
        lienzo.punto = false;
        lienzo.repaint();

        if (puntoAux[0] != null && puntoAux[1] != null && puntoAux[0] != puntoAux[1] && puntoAux[0].colorPunto==puntoAux[1].colorPunto) {
            indiceAristas++;

            aristas[indiceAristas] = new Arista(puntoAux[0], puntoAux[1], false, indiceAristas);

            if (grafo.agregarEnlace(puntoAux[0].getIndice(), puntoAux[1].getIndice(), true) == true) {
                lienzo.setAristas(aristas, indiceAristas);
                repetitivo = false;
               
                puntoAux[0].setColor(Color.ORANGE);
                puntoAux[1].setColor(Color.ORANGE);
            } else {
                aristas[indiceAristas] = null;
                indiceAristas--;
            }
            puntoAux[1] = null;
            puntoAux[0] = null;
            desactivar();
        }
        if (flag == true) {
            movible = null;
            flag = false;
        }


    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        if (Interfaz.aristaNueva.isSelected() == true) {
            if (contador == 1) {
                for (int i = 0; i <= indicePuntos; i++) {

                    if (puntos[i].estaContenido(new Point(e.getX() - 5, e.getY() - 5)) == true) {
                        puntoAux[contador] = puntos[i];
                        puntos[i].setColor(Color.ORANGE);
                    } else {
                        if (puntos[i] != puntoAux[0]) {
                            puntos[i].setColor(Color.ORANGE);
                        }
                    }
                }
                if (contador == 1) {
                    lienzo.punto = true;
                    lienzo.setA(new Point(x, y));
                    lienzo.setB(e.getPoint());
                    lienzo.repaint();
                }
            }
        }
        lienzo.repaint();
    }

    @Override
    public void mouseMoved(MouseEvent e) {
    
    }

    @Override
    public void actionPerformed(ActionEvent e) {
 
    }

    public void cargarArchivo(File file) {
        if (file == null) {
            grafo.destruirGrafo();
        }
    }

    public void cambiaretiqueta() {
        AristaoPunto = 0;
        //repetitivo=false;
        
        String oracion = JOptionPane.showInputDialog("ETIQUETA");
        if (oracion != null) {
            puntos[valor].setEtiqueta(oracion);
        }
        lienzo.repaint();
    }
    
    public void limpiarArea() {
        for (int i = 0; i <= indicePuntos; i++) {
            puntos[i] = null;
        }
        for (int i = 0; i <= indiceAristas; i++) {
            aristas[i] = null;
        }
        indiceAristas = -1;
        indicePuntos = -1;
        lienzo.setPuntos(puntos, indicePuntos);
        lienzo.setAristas(aristas, indiceAristas);
        lienzo.repaint();

    }

    public void agregarnodo(int x, int y) {
        int yaesta;
        indicePuntos++;
        if (grafo.agregarNodo() == true) {
            //repetitivo=false;
         
            Point pun = new Point(x, y);
            yaesta = 0;
            while (yaesta == 0) {
                for (int i = 0; i < indicePuntos; i++) {
                    if (puntos[i].estaContenido(pun) == true) {
                        yaesta = 1;
                    }
                }
                if (yaesta == 1) {
                    pun = new Point(pun.x + 1, pun.y + 1);
                    yaesta = 0;
                } else {
                    yaesta = 1;
                }
            }


            Punto punto = new Punto(pun.x, pun.y, indicePuntos);
            punto.pintarPunto(lienzo.getGraphics());

            puntos[indicePuntos] = punto;
            lienzo.setPuntos(puntos, indicePuntos);
        } else {
            indicePuntos--;
            JOptionPane.showMessageDialog(null, "No se puede Crear más Nodos\n" + "Se ha alcanzado el Limite");

        }
        desactivar();
    }

    public static void desactivar() {
        if (indicePuntos == -1) {
            Interfaz.modificar.setSelected(true);
            Interfaz.cambiarEtiqueta.setEnabled(false);
            Interfaz.aristaNueva.setEnabled(false);
            Interfaz.BarAgregaArista.setEnabled(false);
            Interfaz.BarAgregavertice.setEnabled(true);

        } else {
            Interfaz.cambiarEtiqueta.setEnabled(true);
            Interfaz.BarAgregavertice.setEnabled(true);

            if (AreaDibujo.indiceAristas == -1) {
                Interfaz.aristaNueva.setEnabled(true);
                Interfaz.BarAgregaArista.setEnabled(true);
            } else {

                if (aristas[0].esDirigida()) {
                    Interfaz.aristaNueva.setEnabled(false);
                    Interfaz.BarAgregaArista.setEnabled(false);
                } else {
                    Interfaz.aristaNueva.setEnabled(true);
                    Interfaz.BarAgregaArista.setEnabled(true);
                }
            }
        }
    }
}
