package com.ryuuji.visual.pZone.estudiante;

import logica.ExNihilo;
import logica.Utilities;
import orm.Nota;

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

public class EditarNota extends JFrame {
    private JTextField puntajeTotalField;
    private JTextField puntajeObtenidoField;
    private JTextField notaField;
    private JButton editarButton;
    private JButton calcularButton;
    private JPanel mainPanel;
    private JLabel errorVacio1;
    private JLabel errorVacio2;
    private JLabel errorMayor;

    private double nota;
    private Nota antiguaNota;
    private VerNotas verNotas;

    /**
     * Inicia la ventana con sus valores basicos y llama al metodo init
     *
     * @param verNotas almacena la ventana para mas tarde actualizarla
     * @param nota     Nota que sera modificada
     */
    public EditarNota(VerNotas verNotas, Nota nota) {
        setTitle("Editar Nota");
        setContentPane(mainPanel);
        this.antiguaNota = nota;
        this.verNotas = verNotas;
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        setResizable(false);
        init();
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    /**
     * Llama a setlisteners
     */
    private void init() {
        setListeners();
    }

    /**
     * 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 edicion
     */
    private void setListeners() {
        calcularButton.addActionListener(a -> {
            errorMayor.setVisible(false);
            errorVacio1.setVisible(false);
            errorVacio2.setVisible(false);
            if (comprobar()) {
                calcularNota();
            }
            pack();
        });
        editarButton.addActionListener(a -> {
            errorMayor.setVisible(false);
            errorVacio1.setVisible(false);
            errorVacio2.setVisible(false);
            if (comprobar()) {
                calcularNota();
                ExNihilo.modificarNota(antiguaNota, nota, null, null);
                verNotas.fillTable();
                dispose();
            }
            pack();
        });
    }

    /**
     * Llena la combobox de asignaturas del curso del estudiante almacenado
     */
    private boolean comprobar() {
        boolean vacio1 = puntajeTotalField.getText().trim().isEmpty();
        boolean vacio2 = puntajeObtenidoField.getText().trim().isEmpty();
        if (!vacio1 && !vacio2) {
            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);
            }
            return false;
        }
    }

    /**
     * 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();
        }
    }

}
