package com.ryuuji.visual.pZone.estudiante;

import logica.ExNihilo;
import logica.Search;
import logica.Utilities;
import orm.Anotacion;
import orm.Estudiante;
import orm.Profesor;

import javax.swing.*;

public class AnotacionEditar extends JFrame{
    private JTextArea descripcionField;
    private JRadioButton positivaRadio;
    private JRadioButton negativaRadio;
    private JButton editarButton;
    private JTextField rutField;
    private JTextField verificador;
    private JLabel errorVacio1;
    private JLabel errorVacio2;
    private JLabel errorInvalido;
    private JLabel errorNoExiste;
    private JPanel mainPanel;

    private Estudiante estudiante;
    private Anotacion anotacion;
    private boolean positiva;
    private VerAnotaciones verAnotaciones;

    /**
     * Inicia la ventana con sus valores basicos iniciales
     * @param verAnotaciones Almacena la ventana para actualizarla cuando se modifique la anotacion
     * @param anotacion Anotacion a modificar
     */
    public AnotacionEditar(VerAnotaciones verAnotaciones, Anotacion anotacion){
        this.verAnotaciones = verAnotaciones;
        this.anotacion = anotacion;
        this.estudiante = anotacion.getEstudiante_id_fk();
        setTitle("Añadir Anotacion");
        setContentPane(mainPanel);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        setResizable(false);
        pack();
        setLocationRelativeTo(null);
        init();
        setVisible(true);
    }

    /**
     * Inicia los valores en los campos, asignandole los valores que tiene la anotacion a editar para tener una idea de los valores originales
     * ademas llama a setlisteners
     */
    private void init(){
        descripcionField.setText(anotacion.getDescripcion());
        rutField.setText(
                anotacion.getProfesor_id_fk().getRut().substring(0,anotacion.getProfesor_id_fk().getRut().length()-1));
        verificador.setText(anotacion.getProfesor_id_fk().getRut().substring(anotacion.getProfesor_id_fk().getRut().length()-1));
        if(anotacion.getPositiva()){
            positivaRadio.doClick();
        }else{
            negativaRadio.doClick();
        }
        setListeners();
    }

    /**
     * Le da listeners a el boton editar, este inicia la secuencia de modificacion
     */
    private void setListeners(){
        editarButton.addActionListener(a->{
            setPositiva();
            errorNoExiste.setVisible(false);
            errorInvalido.setVisible(false);
            errorVacio2.setVisible(false);
            errorVacio1.setVisible(false);
            if(comprobarDatos()){
                modificar();
                dispose();
            }
            pack();
        });
    }

    /**
     * Asigna un valor al booleano positiva segun lo seleccionado en los radio button para indicar si la anotacion es positiva o no
     */
    private void setPositiva(){
        positiva = positivaRadio.isSelected();
    }

    /**
     * Comprueba los datos ingresados, mostrando un error en la ventana si algun dato es incorrecto
     * @return un booleano indicando si se paso la comprobacion o no.
     */
    private boolean comprobarDatos(){
        if((rutField.getText()+verificador.getText()).trim().isEmpty()){
            errorVacio2.setVisible(true);
            return false;
        }
        if(!Utilities.validarRut(rutField.getText(),verificador.getText())){
            errorInvalido.setVisible(true);
            return false;
        }
        String rut = rutField.getText() + verificador.getText();
        Profesor profesor = Search.buscarProfesor(rut);
        boolean existe = profesor!=null;
        boolean vacio1 = descripcionField.getText().trim().isEmpty();
        if(existe&&!vacio1){
            return true;
        }else{
            if(!existe){
                errorNoExiste.setVisible(true);
                return false;
            }
            if(vacio1){
                errorVacio1.setVisible(true);
                return false;
            }
        }
        return false;
    }

    /**
     * Modifica la anotacion con los datos ingresados
     */
    private void modificar(){
        String descripcion = descripcionField.getText();
        Profesor profesor = Search.buscarProfesor(rutField.getText()+verificador.getText());
        ExNihilo.modificarAnotacion(anotacion, positiva, descripcion, estudiante,profesor);
        verAnotaciones.fillTable();
    }
}
