package com.ryuuji.visual.pZone.estudiante;

import logica.ExNihilo;
import logica.Listas;
import logica.Search;
import logica.Utilities;
import orm.Apoderado;
import orm.Curso;

import javax.swing.*;

public class EstudianteCrear extends JFrame {

    private EstudianteAnalizar estudianteAnalizar;
    private JPanel mainPanel;
    private JTextField nombreField;
    private JComboBox cursoBox;
    private JButton crearButton;

    private JTextField rutField1;
    private JTextField verField1;
    private JTextField rutField2;
    private JTextField verField2;

    private JLabel errorVacio1;
    private JLabel errorVacio2;
    private JLabel errorSinSeleccionar;
    private JLabel errorVacio3;
    private JLabel errorNoValido1;
    private JLabel errorNoValido2;
    private JLabel errorIngresado;
    private JLabel errorNoExiste;
    private JLabel errorIguales;

    private Curso selectedCurso;

    /**
     * Constructor predeterminado
     * Inicia la ventana
     */
    public EstudianteCrear(EstudianteAnalizar parent) {
        setTitle("Crear Estudiante");
        this.estudianteAnalizar = parent;
        setContentPane(mainPanel);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        setResizable(false);
        pack();
        setLocationRelativeTo(null);
        init();
        setVisible(true);
    }

    /**
     * llama a los metodos fillCurso y setListener
     */
    private void init(){
        fillCurso();
        setListener();
    }

    /**
     * le da un listener al boton crear el cual inicia el proceso de creado de estudiante
     */
    private void setListener(){
        crearButton.addActionListener(a->{
            setCurso();
            clearError();
            if(comprobar()){
                crear();
            }
            pack();
        });
    }

    /**
     * limpia los mensajes de error de la ventana
     */
    private void clearError(){
        errorIngresado.setVisible(false);
        errorNoExiste.setVisible(false);
        errorSinSeleccionar.setVisible(false);
        errorNoValido2.setVisible(false);
        errorNoValido1.setVisible(false);
        errorVacio1.setVisible(false);
        errorVacio2.setVisible(false);
        errorVacio3.setVisible(false);
        errorIguales.setVisible(false);
    }

    /**
     * almacena el curso que fue seleccionado en la combobox
     */
    private void setCurso() {
        selectedCurso = null;
        String[] curso = ((String)cursoBox.getSelectedItem()).split("-");
        int nivel = Integer.valueOf(curso[0]);
        String letra = curso[1];
        selectedCurso = Search.buscarCurso(nivel,letra);
    }

    /**
     * Comprueba los datos ingresados, si es que ocurre algun problema con ellos, mostrara un mensaje de error en la ventana
     * @return boolean indicando si es que fue correcta la comprobacion
     */
    private boolean comprobar(){
        boolean vacio1 = nombreField.getText().trim().isEmpty();
        boolean vacio2 = (rutField1.getText()+verField1.getText()).trim().isEmpty();
        boolean vacio3 = (rutField2.getText()+verField2.getText()).trim().isEmpty();
        if(!vacio1&&!vacio2&&!vacio3){
            boolean valido1 = Utilities.validarRut(rutField1.getText(),verField1.getText());
            boolean valido2 = Utilities.validarRut(rutField2.getText(),verField2.getText());
            boolean boxSelected =  selectedCurso!=null;
            if(valido1&&valido2&&boxSelected){
                boolean iguales = (rutField1.getText()+verField1.getText()).equals(rutField2.getText()+verField2.getText());
                if(!iguales) {
                    boolean usado = Search.buscarEstudiante(rutField1.getText() + verField1.getText()) != null;
                    boolean existe = Search.buscarApoderado(rutField2.getText() + verField2.getText()) != null;
                    if (!usado && existe) {
                        return true;
                    } else {
                        if (!existe) {
                            errorNoExiste.setVisible(true);
                            return false;
                        }
                        if (usado) {
                            errorIngresado.setVisible(true);
                            return false;
                        }
                    }
                }else{
                    errorIguales.setVisible(true);
                    return false;
                }
            }else{
                if(!valido1){
                    errorNoValido1.setVisible(true);
                    return false;
                }
                if(!valido2){
                    errorNoValido2.setVisible(true);
                    return false;
                }
                if(!boxSelected){
                    errorSinSeleccionar.setVisible(true);
                    return false;
                }
            }
        }else{
            if(vacio1){
                errorVacio1.setVisible(true);
                return false;
            }
            if(vacio2){
                errorVacio2.setVisible(true);
                return false;
            }
            if(vacio3){
                errorVacio3.setVisible(true);
                return false;
            }
        }
        return false;
    }

    /**
     * Crea el nuevo estudiante
     */
    private void crear(){
        String nombre = nombreField.getText();
        String rut = rutField1.getText()+verField1.getText();
        Apoderado apoderado = Search.buscarApoderado(rutField2.getText()+verField2.getText());
        ExNihilo.crearEstudiante(nombre,rut,selectedCurso,apoderado);
        estudianteAnalizar.fillTable();
        dispose();
    }

    /**
     * Rellena la lista de cursos en el combobox
     */
    private void fillCurso(){
        String[] cursos = Listas.listaCursos();
        if(cursos!=null){
            for (String curso : cursos) {
                ((DefaultComboBoxModel)cursoBox.getModel()).addElement(curso);
            }
        }
    }


}
