package com.ryuuji.visual.pZone.estudiante;

import com.ryuuji.visual.pZone.PZone;
import logica.ExNihilo;
import logica.Listas;
import logica.Search;
import orm.Curso;
import orm.Estudiante;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class EstudianteAnalizar extends JFrame {
    private JPanel mainPanel;

    private JComboBox<String> cursosBox;

    private JTable table;
    private JLabel errorSeleccionar;

    private JButton notas;
    private JButton asistencia;
    private JButton anotaciones;

    private JButton salirButton;
    private JButton crearEstudianteButton;
    private JButton eliminarEstudianteButton;

    private Curso cursoSelected;
    private Estudiante estudianteSelected;

    /**
     * Inicia los valores basicos de la ventana, ademas llama al metodo init().
     */
    public EstudianteAnalizar() {
        setTitle("Analizar Estudiantes");
        setContentPane(mainPanel);
        setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        addWindowListener(
                new WindowAdapter() {
                    @Override
                    public void windowClosing(WindowEvent e) {
                        new PZone();
                        dispose();
                    }
                }
        );
        setResizable(false);
        pack();
        setLocationRelativeTo(null);
        init();
        setVisible(true);
    }

    /**
     * Inicia la tabla con sus valores basicos.
     */
    private void createUIComponents() {
        table = new JTable(new DefaultTableModel(new String[]{"Nombre", "Rut"}, 0) {

            @Override
            public boolean isCellEditable(int row, int column) {
                //all cells false
                return false;
            }
        });
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    }

    /**
     * llama a setlisteners, a fillbox y a filltable
     */
    private void init() {
        setListeners();
        fillBox();
        fillTable();
    }

    /**
     * añade los listeners a los botones, a la selecciones en las tablas y los combobox
     */
    private void setListeners() {
        salirButton.addActionListener(a -> {
            new PZone();
            dispose();
        });
        cursosBox.addActionListener(a -> fillTable());
        crearEstudianteButton.addActionListener(a -> new EstudianteCrear(this));
        eliminarEstudianteButton.addActionListener(a -> {
            errorSeleccionar.setVisible(false);
            setEstudiante();
            if (estudianteSelected != null) {
                eliminarEstudiante();
                fillTable();
            } else {
                errorSeleccionar.setVisible(true);
            }
            pack();
        });
        anotaciones.addActionListener(a -> {
            errorSeleccionar.setVisible(false);
            setEstudiante();
            if (estudianteSelected != null) {
                new VerAnotaciones(estudianteSelected);
            } else {
                errorSeleccionar.setVisible(true);
            }
            pack();
        });
        asistencia.addActionListener(a -> {
            errorSeleccionar.setVisible(false);
            setEstudiante();
            if (estudianteSelected != null) {
                new VerAsistencias(estudianteSelected);
            } else {
                errorSeleccionar.setVisible(true);
            }
            pack();
        });
        notas.addActionListener(a -> {
            errorSeleccionar.setVisible(false);
            setEstudiante();
            if (estudianteSelected != null) {
                new VerNotas(estudianteSelected);
            } else {
                errorSeleccionar.setVisible(true);
            }
            pack();
        });
    }

    /**
     * Elimina el estudiante que esta seleccionado en la tabla
     */
    private void eliminarEstudiante() {
        int selected = JOptionPane.showConfirmDialog(this, "¿Esta seguro?", "Confirmar", JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);
        if (selected == 0) {
            ExNihilo.eliminarEstudiante(estudianteSelected);
        }
    }

    /**
     * Almacena el curso seleccionado en la jcombobox
     */
    private void setCurso() {
        if (cursosBox.getSelectedItem() != null) {
            String[] curso = ((String) cursosBox.getSelectedItem()).split("-");
            int nivel = Integer.valueOf(curso[0]);
            String letra = curso[1];
            this.cursoSelected = Search.buscarCurso(nivel, letra);
        }
    }

    /**
     * Almacena el estudiante seleccionado en la tabla
     */
    private void setEstudiante() {
        if (table.getSelectedRow() >= 0) {
            String rut = (String) table.getValueAt(table.getSelectedRow(), 1);
            estudianteSelected = Search.buscarEstudiante(rut);
        }
    }

    /**
     * llena la combobox con los cursos del sistema.
     */
    protected void fillBox() {
        DefaultComboBoxModel model = (DefaultComboBoxModel) cursosBox.getModel();
        String[] cursos = Listas.listaCursos();
        if (cursos != null) {
            for (String curso : cursos) {
                model.addElement(curso);
            }
        }
    }

    /**
     * llena la tabla con los estudiantes de el curso seleccionado
     */
    protected void fillTable() {
        setCurso();
        if (cursoSelected != null) {
            DefaultTableModel model = (DefaultTableModel) table.getModel();
            model.setRowCount(0);
            String[][] lista = Listas.listaEstudiantes(cursoSelected);
            if (lista != null) {
                for (String[] row : lista) model.addRow(row);
            }
        }
    }


}
