package net.h4ckx0r.vista;

import net.h4ckx0r.controlador.ControladorCurso;
import net.h4ckx0r.controlador.ControladorEstudiante;
import net.h4ckx0r.controlador.ControladorMateria;
import net.h4ckx0r.modelo.Curso;
import net.h4ckx0r.modelo.Estudiante;
import net.h4ckx0r.modelo.Materia;
import net.h4ckx0r.vista.panels.PanelCursos;
import net.h4ckx0r.vista.panels.PanelMaterias;
import net.h4ckx0r.vista.panels.PanelPersona;
import net.h4ckx0r.vista.panels.PanelValoracionMaterias;

import java.awt.*;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

public class MainView extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    private JTabbedPane tabbedPane;

    private PanelCursos panelCursos = new PanelCursos();
    private PanelMaterias panelMaterias = new PanelMaterias();
    private PanelPersona panelEstudiantes = new PanelPersona();
    private PanelPersona panelProfesores = new PanelPersona();
    private PanelValoracionMaterias panelValoracionMaterias = new PanelValoracionMaterias();

    private JButton btnFirst;
    private JButton btnNext;
    private JButton btnPrev;
    private JButton btnLast;


    private ImageIcon iconAdd = new ImageIcon(MainView.class.getResource("/images/add.png"));
    private ImageIcon iconDelete = new ImageIcon(MainView.class.getResource("/images/delete.png"));
    private ImageIcon iconSave = new ImageIcon(MainView.class.getResource("/images/save.png"));

    private ImageIcon iconFirst = new ImageIcon(MainView.class.getResource("/images/first.png"));
    private ImageIcon iconPrevious = new ImageIcon(MainView.class.getResource("/images/previus.png"));
    private ImageIcon iconNext = new ImageIcon(MainView.class.getResource("/images/next.png"));
    private ImageIcon iconLast = new ImageIcon(MainView.class.getResource("/images/last.png"));


    private ImageIcon iconCursos = new ImageIcon(MainView.class.getResource("/images/cursos.png"));
    private ImageIcon iconMaterias = new ImageIcon(MainView.class.getResource("/images/materias.png"));
    private ImageIcon iconEstudiantes = new ImageIcon(MainView.class.getResource("/images/estudiantes.png"));
    private ImageIcon iconProfesores = new ImageIcon(MainView.class.getResource("/images/profesores.png"));
    private ImageIcon iconValoracionMaterias = new ImageIcon(MainView.class.getResource("/images/valoracionMaterias.png"));

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MainView frame = new MainView();
                    frame.panelCursos.setCursoActual(ControladorCurso.getPrimerCurso());
                    frame.panelMaterias.setMateriaActual(ControladorMateria.getPrimeraMateria());
                    frame.panelEstudiantes.setEstudianteActual(ControladorEstudiante.getPrimerEstudiante());


                    frame.actualizarBotonesPantalla();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public MainView() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(0, 0, 700, 500);
        setLocationRelativeTo(null);

        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);

        JMenu mnNewMenu = new JMenu("Gestión");
        menuBar.add(mnNewMenu);

        JMenuItem menuItemCursos = new JMenuItem("Cursos");
        menuItemCursos.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                tabbedPane.setSelectedComponent(panelCursos);
            }
        });
        menuItemCursos.setIcon(new ImageIcon(iconCursos.getImage().getScaledInstance(24, 24, Image.SCALE_SMOOTH)));
        mnNewMenu.add(menuItemCursos);

        JMenuItem menuItemMaterias = new JMenuItem("Materias");
        menuItemMaterias.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                tabbedPane.setSelectedComponent(panelMaterias);
            }
        });
        menuItemMaterias.setIcon(new ImageIcon(iconMaterias.getImage().getScaledInstance(24, 24, Image.SCALE_SMOOTH)));
        mnNewMenu.add(menuItemMaterias);

        JMenuItem menuItemEstudiantes = new JMenuItem("Estudiantes");
        menuItemEstudiantes.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                tabbedPane.setSelectedComponent(panelEstudiantes);
            }
        });
        menuItemEstudiantes.setIcon(new ImageIcon(iconEstudiantes.getImage().getScaledInstance(24, 24, Image.SCALE_SMOOTH)));
        mnNewMenu.add(menuItemEstudiantes);

        JMenuItem menuItemProfesores = new JMenuItem("Profesores");
        menuItemProfesores.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                tabbedPane.setSelectedComponent(panelProfesores);
            }
        });
        menuItemProfesores.setIcon(new ImageIcon(iconProfesores.getImage().getScaledInstance(24, 24, Image.SCALE_SMOOTH)));
        mnNewMenu.add(menuItemProfesores);

        JMenuItem menuItemValoracionesMaterias = new JMenuItem("Valoraciones Materias");
        menuItemValoracionesMaterias.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                tabbedPane.setSelectedComponent(panelValoracionMaterias);
            }
        });
        menuItemValoracionesMaterias.setIcon(new ImageIcon(iconValoracionMaterias.getImage().getScaledInstance(24, 24, Image.SCALE_SMOOTH)));
        mnNewMenu.add(menuItemValoracionesMaterias);


        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

        setContentPane(contentPane);
        contentPane.setLayout(new BorderLayout(0, 0));

        JToolBar toolBar = new JToolBar();
        contentPane.add(toolBar, BorderLayout.NORTH);

        JButton btnAdd = new JButton("");
        btnAdd.setIcon(new ImageIcon(iconAdd.getImage().getScaledInstance(24, 24, Image.SCALE_SMOOTH)));
        btnAdd.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                agregarRegistro();
            }
        });
        toolBar.add(btnAdd);

        JButton btnDelete = new JButton("");
        btnDelete.setIcon(new ImageIcon(iconDelete.getImage().getScaledInstance(24, 24, Image.SCALE_SMOOTH)));
        btnDelete.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                borrarRegistro();
            }
        });
        toolBar.add(btnDelete);

        JButton btnSave = new JButton("");
        btnSave.setIcon(new ImageIcon(iconSave.getImage().getScaledInstance(24, 24, Image.SCALE_SMOOTH)));
        btnSave.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                guardarRegistro();
            }
        });
        toolBar.add(btnSave);

        toolBar.addSeparator();

        btnFirst = new JButton("");
        btnFirst.setIcon(new ImageIcon(iconFirst.getImage().getScaledInstance(24, 24, Image.SCALE_SMOOTH)));
        btnFirst.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                cargarPrimerRegistro();
            }
        });
        toolBar.add(btnFirst);

        btnPrev = new JButton("");
        btnPrev.setIcon(new ImageIcon(iconPrevious.getImage().getScaledInstance(24, 24, Image.SCALE_SMOOTH)));
        btnPrev.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                cargarAnteriorRegistro();
            }
        });
        toolBar.add(btnPrev);

        btnNext = new JButton("");
        btnNext.setIcon(new ImageIcon(iconNext.getImage().getScaledInstance(24, 24, Image.SCALE_SMOOTH)));
        btnNext.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                cargarSiguienteRegistro();
            }
        });
        toolBar.add(btnNext);

        btnLast = new JButton("");
        btnLast.setIcon(new ImageIcon(iconLast.getImage().getScaledInstance(24, 24, Image.SCALE_SMOOTH)));
        btnLast.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                cargarUltimoRegistro();
            }
        });
        toolBar.add(btnLast);


        tabbedPane = new JTabbedPane(JTabbedPane.TOP);
        contentPane.add(tabbedPane, BorderLayout.CENTER);
        panelCursos.addComponentListener(new ComponentAdapter() {
        	@Override
        	public void componentShown(ComponentEvent e) {
                actualizarBotonesPantalla();
        	}
        });
        panelMaterias.addComponentListener(new ComponentAdapter() {
        	@Override
        	public void componentShown(ComponentEvent e) {
                actualizarBotonesPantalla();
        	}
        });
        panelEstudiantes.addComponentListener(new ComponentAdapter() {
        	@Override
        	public void componentShown(ComponentEvent e) {
                actualizarBotonesPantalla();
        	}
        });
        panelProfesores.addComponentListener(new ComponentAdapter() {
        	@Override
        	public void componentShown(ComponentEvent e) {
                actualizarBotonesPantalla();
        	}
        });
        panelValoracionMaterias.addComponentListener(new ComponentAdapter() {
        	@Override
        	public void componentShown(ComponentEvent e) {
                actualizarBotonesPantalla();
        	}
        });

        tabbedPane.addTab("Cursos", iconCursos, panelCursos, null);
        tabbedPane.addTab("Materias", iconMaterias, panelMaterias, null);
        tabbedPane.addTab("Estudiantes", iconEstudiantes, panelEstudiantes, null);
        tabbedPane.addTab("Profesores", iconProfesores, panelProfesores, null);
        tabbedPane.addTab("Valoraciones Materias", iconValoracionMaterias, panelValoracionMaterias, null);
    }


    private void agregarRegistro() {
        cargarUltimoRegistro();
        if (tabbedPane.getSelectedComponent() == panelCursos) {
            panelCursos.setCursoActual(new Curso(-1, ""));
        } else if (tabbedPane.getSelectedComponent() == panelMaterias) {
            panelMaterias.setMateriaActual(new Materia(-1, "", "", -1));
        } else if (tabbedPane.getSelectedComponent() == panelEstudiantes) {
            panelEstudiantes.setEstudianteActual(new Estudiante(-1, "", "", "", "", "", "", "", -1));
        }
    }

    private void borrarRegistro() {
        if (JOptionPane.showConfirmDialog(this, "¿Desea borrar el registro?", "¿Está seguro?", JOptionPane.YES_NO_OPTION) != 0) {
            return;
        }

        int resultado = 0;

        if (tabbedPane.getSelectedComponent() == panelCursos) {
            Curso cursoSiguiente = ControladorCurso.getSiguienteCurso(panelCursos.getCursoActual());
            Curso cursoAnterior = ControladorCurso.getAnteriorCurso(panelCursos.getCursoActual());

            resultado = ControladorCurso.borrarCurso(panelCursos.getCursoActual());
            if (resultado > 0) {
                if (cursoSiguiente != null) {
                    panelCursos.setCursoActual(cursoSiguiente);
                } else if (cursoAnterior != null) {
                    panelCursos.setCursoActual(cursoAnterior);
                } else {
                    agregarRegistro();
                }
            }
        } else if (tabbedPane.getSelectedComponent() == panelMaterias) {
            Materia materiaSiguiente = ControladorMateria.getSiguienteMateria(panelMaterias.getMateriaActual());
            Materia materiaAnterior = ControladorMateria.getAnteriorMateria(panelMaterias.getMateriaActual());

            resultado = ControladorMateria.borrarMateria(panelMaterias.getMateriaActual());
            if (resultado > 0) {
                if (materiaSiguiente != null) {
                    panelMaterias.setMateriaActual(materiaSiguiente);
                } else if (materiaAnterior != null) {
                    panelMaterias.setMateriaActual(materiaAnterior);
                } else {
                    agregarRegistro();
                }
            }
        } else if (tabbedPane.getSelectedComponent() == panelEstudiantes) {
            Estudiante estudianteSiguiente = ControladorEstudiante.getSiguienteEstudiante(panelEstudiantes.getEstudianteActual());
            Estudiante estudianteAnterior = ControladorEstudiante.getAnteriorEstudiante(panelEstudiantes.getEstudianteActual());

            resultado = ControladorEstudiante.borrarEstudiante(panelEstudiantes.getEstudianteActual());
            if (resultado > 0) {
                if (estudianteSiguiente != null) {
                    panelEstudiantes.setEstudianteActual(estudianteSiguiente);
                } else if (estudianteAnterior != null) {
                    panelEstudiantes.setEstudianteActual(estudianteAnterior);
                } else {
                    agregarRegistro();
                }
            }
        }

        if (resultado > 0) {
            JOptionPane.showMessageDialog(this, "Registro borrado correctamente");
        } else {
            JOptionPane.showMessageDialog(this, "No se pudo borrar el registro");
        }

    }

    private void guardarRegistro() {
        int resultado = 0;
        if (tabbedPane.getSelectedComponent() == panelCursos) {
            resultado = ControladorCurso.guardarCurso(panelCursos.getCursoActual());
        } else if (tabbedPane.getSelectedComponent() == panelMaterias) {
            resultado = ControladorMateria.guardarMateria(panelMaterias.getMateriaActual());
        } else if (tabbedPane.getSelectedComponent() == panelEstudiantes) {
            resultado = ControladorEstudiante.guardarEstudiante(panelEstudiantes.getEstudianteActual());
        }

        if (resultado > 0) {
            JOptionPane.showMessageDialog(this, "Registro guardado correctamente");
        } else {
            JOptionPane.showMessageDialog(this, "No se pudo guardar el registro");
        }


    }


    private void cargarPrimerRegistro() {
        if (tabbedPane.getSelectedComponent() == panelCursos) {
            Curso primerCurso = ControladorCurso.getPrimerCurso();
            if (primerCurso != null) {
                panelCursos.setCursoActual(primerCurso);
                actualizarBotonesPantalla();
            }
        } else if (tabbedPane.getSelectedComponent() == panelMaterias) {
            Materia primeraMateria = ControladorMateria.getPrimeraMateria();
            if (primeraMateria != null) {
                panelMaterias.setMateriaActual(primeraMateria);
                actualizarBotonesPantalla();
            }
        } else if (tabbedPane.getSelectedComponent() == panelEstudiantes) {
            Estudiante primerEstudiante = ControladorEstudiante.getPrimerEstudiante();
            if (primerEstudiante != null) {
                panelEstudiantes.setEstudianteActual(primerEstudiante);
                actualizarBotonesPantalla();
            }
        }

    }

    private void cargarUltimoRegistro() {
        if (tabbedPane.getSelectedComponent() == panelCursos) {
            Curso ultimoCurso = ControladorCurso.getUltimoCurso();
            if (ultimoCurso != null) {
                panelCursos.setCursoActual(ultimoCurso);
                actualizarBotonesPantalla();
            }
        } else if (tabbedPane.getSelectedComponent() == panelMaterias) {
            Materia ultimaMateria = ControladorMateria.getUltimaMateria();
            if (ultimaMateria != null) {
                panelMaterias.setMateriaActual(ultimaMateria);
                actualizarBotonesPantalla();
            }
        } else if (tabbedPane.getSelectedComponent() == panelEstudiantes) {
            Estudiante ultimoEstudiante = ControladorEstudiante.getUltimoEstudiante();
            if (ultimoEstudiante != null) {
                panelEstudiantes.setEstudianteActual(ultimoEstudiante);
                actualizarBotonesPantalla();
            }
        }
    }

    private void cargarSiguienteRegistro() {

        if (tabbedPane.getSelectedComponent() == panelCursos) {
            Curso siguienteCurso = ControladorCurso.getSiguienteCurso(panelCursos.getCursoActual());
            if (siguienteCurso != null) {
                panelCursos.setCursoActual(siguienteCurso);
                actualizarBotonesPantalla();
            }

        } else if (tabbedPane.getSelectedComponent() == panelMaterias) {
            Materia siguienteMateria = ControladorMateria.getSiguienteMateria(panelMaterias.getMateriaActual());
            if (siguienteMateria != null) {
                panelMaterias.setMateriaActual(siguienteMateria);
                actualizarBotonesPantalla();
            }
        } else if (tabbedPane.getSelectedComponent() == panelEstudiantes) {
            Estudiante siguienteEstudiante = ControladorEstudiante.getSiguienteEstudiante(panelEstudiantes.getEstudianteActual());
            if (siguienteEstudiante != null) {
                panelEstudiantes.setEstudianteActual(siguienteEstudiante);
                actualizarBotonesPantalla();
            }
        }

    }

    private void cargarAnteriorRegistro() {
        if (tabbedPane.getSelectedComponent() == panelCursos) {
            Curso cursoActual = panelCursos.getCursoActual();
            if (cursoActual.getId() == -1) {
                panelCursos.setCursoActual(ControladorCurso.getUltimoCurso());
            } else {
                Curso anteriorCurso = ControladorCurso.getAnteriorCurso(cursoActual);
                if (anteriorCurso != null) {
                    panelCursos.setCursoActual(anteriorCurso);
                    actualizarBotonesPantalla();
                }
            }
        } else if (tabbedPane.getSelectedComponent() == panelMaterias) {
            Materia materiaActual = panelMaterias.getMateriaActual();
            if (materiaActual.getId() == -1) {
                panelMaterias.setMateriaActual(ControladorMateria.getUltimaMateria());
            } else {
                Materia anteriorMateria = ControladorMateria.getAnteriorMateria(panelMaterias.getMateriaActual());
                if (anteriorMateria != null) {
                    panelMaterias.setMateriaActual(anteriorMateria);
                    actualizarBotonesPantalla();
                }
            }
        } else if (tabbedPane.getSelectedComponent() == panelEstudiantes) {
            Estudiante estudianteActual = panelEstudiantes.getEstudianteActual();
            if (estudianteActual.getId() == -1) {
                panelEstudiantes.setEstudianteActual(ControladorEstudiante.getUltimoEstudiante());
            } else {
                Estudiante anteriorEstudiante = ControladorEstudiante.getAnteriorEstudiante(panelEstudiantes.getEstudianteActual());
                if (anteriorEstudiante != null) {
                    panelEstudiantes.setEstudianteActual(anteriorEstudiante);
                    actualizarBotonesPantalla();
                }
            }
        }
    }

    private void actualizarBotonesPantalla() {
        if (tabbedPane.getSelectedComponent() == panelCursos) {
            Curso cursoActual = panelCursos.getCursoActual();
            alternarBotonesToolbar(
                    cursoActual.getId() == ControladorCurso.getPrimerCurso().getId(),
                    cursoActual.getId() == ControladorCurso.getUltimoCurso().getId());
        } else if (tabbedPane.getSelectedComponent() == panelMaterias) {
            Materia materiaActual = panelMaterias.getMateriaActual();
            alternarBotonesToolbar(
                    materiaActual.getId() == ControladorMateria.getPrimeraMateria().getId(),
                    materiaActual.getId() == ControladorMateria.getUltimaMateria().getId());
        } else if (tabbedPane.getSelectedComponent() == panelEstudiantes) {
            Estudiante estudianteActual = panelEstudiantes.getEstudianteActual();
            alternarBotonesToolbar(
                    estudianteActual.getId() == ControladorEstudiante.getPrimerEstudiante().getId(),
                    estudianteActual.getId() == ControladorEstudiante.getUltimoEstudiante().getId());
        }
    }

    private void alternarBotonesToolbar(boolean esPrimero, boolean esUltimo) {
        if (esPrimero) {
            btnFirst.setEnabled(false);
            btnPrev.setEnabled(false);
        } else {
            btnFirst.setEnabled(true);
            btnPrev.setEnabled(true);
        }
        if (esUltimo) {
            btnNext.setEnabled(false);
            btnLast.setEnabled(false);
        } else {
            btnNext.setEnabled(true);
            btnLast.setEnabled(true);
        }
    }

}
