package com.ryuuji.visual.pZone.estudiante;

import logica.ExNihilo;
import logica.Listas;
import logica.Search;
import logica.Utilities;
import orm.Asignatura;
import orm.Estudiante;

import javax.swing.*;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.ParseException;

public class AñadirNota extends JFrame {
    private JPanel mainPanel;
    private JComboBox<Object> asignaturaBox;
    private JTextField puntajeTotalField;
    private JTextField puntajeObtenidoField;
    private JTextField notaField;
    private JLabel errorMenor;
    private JButton añadirButton;
    private JButton calcularButton;
    private JLabel errorVacio2;
    private JLabel errorVacio1;
    private JLabel errorMayor;
    private JLabel errorSeleccionar;

    private double nota;
    private Asignatura asignatura;
    private Estudiante estudiante;
    private VerNotas verNotas;

    /**
     * Inicia la ventana para la creacion de notas
     *
     * @param verNotas   almacena esta ventana para la actualizacion de esta cuando se cree una nota
     * @param estudiante Estudiante al que se le añadira la nota
     */
    public AñadirNota(VerNotas verNotas, Estudiante estudiante) {
        this.estudiante = estudiante;
        this.verNotas = verNotas;
        setTitle("Añadir Nota");
        setContentPane(mainPanel);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        setResizable(false);
        init();
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    /**
     * Llama a los metodos setListeners y fillAsignaturas
     */
    private void init() {
        setListeners();
        fillAsignaturas();
    }

    /**
     * Añade listeners a los botones de la ventana
     * el listener del boton calcular solo llama a comprobar y calcular
     * el listener del boton añadir realiza el proceso de creacion
     */
    private void setListeners() {
        calcularButton.addActionListener(a -> {
            errorMayor.setVisible(false);
            errorVacio1.setVisible(false);
            errorVacio2.setVisible(false);
            if (comprobar()) {
                calcularNota();
            }
            pack();
        });
        añadirButton.addActionListener(a -> {
            errorMayor.setVisible(false);
            errorVacio1.setVisible(false);
            errorVacio2.setVisible(false);
            setAsignatura();
            if (comprobar()) {
                calcularNota();
                ExNihilo.crearNota(nota, asignatura, estudiante);
                verNotas.fillTable();
                dispose();
            }
            pack();
        });
    }

    /**
     * Llena la combobox de asignaturas del curso del estudiante almacenado
     */
    private void fillAsignaturas() {
        String[] asignaturas = Listas.listaAsignaturas(estudiante.getCurso_id_fk());
        if (asignaturas != null) {
            for (String asignatura : asignaturas) {
                asignaturaBox.addItem(asignatura);
            }
        }
    }

    /**
     * almacena la asignatura seleccionada en la combobox
     */
    private void setAsignatura() {
        asignatura = null;
        String selected = (String) asignaturaBox.getSelectedItem();
        if (selected != null) {
            asignatura = Search.buscarAsignatura(selected, estudiante.getCurso_id_fk());
        }
    }

    /**
     * Calcula la nota con los datos ingresados
     */
    private void calcularNota() {
        nota = 0;
        DecimalFormat format = new DecimalFormat("#.#");
        format.setRoundingMode(RoundingMode.CEILING);
        try {
            double total = format.parse(puntajeTotalField.getText()).doubleValue();
            double obtenido = format.parse(puntajeObtenidoField.getText()).doubleValue();
            nota = Utilities.calcularNota(total, obtenido);
            notaField.setText(format.format(nota));
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    /**
     * Comprueba los datos ingresados, si hay algun error muestra un mensaje al respecto
     * @return un booleano indicando si la comprobacion fue correcta o no
     */
    private boolean comprobar() {
        boolean vacio1 = puntajeTotalField.getText().trim().isEmpty();
        boolean vacio2 = puntajeObtenidoField.getText().trim().isEmpty();
        boolean seleccionado = asignaturaBox.getSelectedItem() != null;
        if (!vacio1 && !vacio2 && seleccionado) {
            boolean mayor = Integer.valueOf(puntajeObtenidoField.getText()) > Integer.valueOf(puntajeTotalField.getText());
            if (!mayor) {
                return true;
            } else {
                errorMayor.setVisible(true);
                return false;
            }
        } else {
            if (vacio1) {
                errorVacio1.setVisible(true);
            }
            if (vacio2) {
                errorVacio2.setVisible(true);
            }
            if (!seleccionado) {
                errorSeleccionar.setVisible(true);
            }
            return false;
        }
    }
}
