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 orm.Nota;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.text.DecimalFormat;

public class VerNotas extends JFrame {
    private final Estudiante estudiante;
    private JPanel mainPanel;
    private JTable table;
    private JButton editarButton;
    private JButton salirButton;
    private JButton eliminarButton;
    private JComboBox<String> asignaturaBox;
    private JTextField promedioField;
    private JLabel errorSeleccionar;
    private JButton añadirButton;

    private Asignatura asignatura;
    private Nota nota;

    /**
     * Inicia la ventana para ventana de notas con los valores basicos
     *
     * @param estudiante es el estudiante al que le pertenecen las notas
     */
    public VerNotas(Estudiante estudiante) {
        this.estudiante = estudiante;
        setTitle("Ver notas");
        setContentPane(mainPanel);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        setResizable(false);
        init();
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

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

    /**
     * Añade los listeners a los botones, al combobox de asignatura y la tabla cuando se selecciona.
     */
    private void setListeners() {
        asignaturaBox.addActionListener(a -> {
            setAsignatura();
            fillTable();
        });
        table.getSelectionModel().addListSelectionListener(a -> setNota());
        salirButton.addActionListener(a -> dispose());
        añadirButton.addActionListener(a -> {
            errorSeleccionar.setVisible(false);
            new AñadirNota(this, estudiante);
        });
        editarButton.addActionListener(a -> {
            errorSeleccionar.setVisible(false);
            setNota();
            if (nota != null) {
                new EditarNota(this, nota);
            } else {
                errorSeleccionar.setVisible(true);
            }
        });
        eliminarButton.addActionListener(a -> {
            errorSeleccionar.setVisible(false);
            setNota();
            if (nota != null) {
                eliminar();
                fillTable();
            } else {
                errorSeleccionar.setVisible(true);
            }
        });

    }

    /**
     * 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());
        } else {
            errorSeleccionar.setVisible(true);
        }
    }

    /**
     * Almacena la nota seleccionada en la tabla.
     */
    private void setNota() {
        nota = null;
        if (table.getSelectedRow() >= 0) {
            String selected = (String) table.getValueAt(table.getSelectedRow(), 0);
            nota = Search.buscarNota(estudiante, asignatura, Double.parseDouble(selected));
        }
    }

    /**
     * Calcula el promedio de notas de la tabla y las muestra en el textfield
     */
    private void setPromedio() {
        double promedio = 0D;
        DecimalFormat format = new DecimalFormat("#.#");
        if (table.getRowCount() > 0) {
            double[] notas = new double[table.getRowCount()];
            for (int x = 0; x < table.getRowCount(); x++) {
                notas[x] = Double.valueOf((String) table.getValueAt(x, 0));
            }
            promedio = Utilities.calcularPromedio(notas);
        }
        promedioField.setText(format.format(promedio));
    }

    /**
     * llena las tablas con las notas de la asignatura seleccionada
     */
    public void fillTable() {
        DefaultTableModel model = (DefaultTableModel) table.getModel();
        model.setRowCount(0);
        String[][] notas = Listas.listaNotas(estudiante, asignatura);
        if (notas != null) {
            for (String[] nota : notas) {
                model.addRow(nota);
            }
        }
        setPromedio();
    }

    /**
     * llena las box de las asignaturas del curso seleccionado
     */
    private void fillBox() {
        String[] asignaturas = Listas.listaAsignaturas(estudiante.getCurso_id_fk());
        if (asignaturas != null) {
            for (String asignatura : asignaturas) {
                ((DefaultComboBoxModel) asignaturaBox.getModel()).addElement(asignatura);
            }
        }
    }

    /**
     * Elimina la nota seleccionada en la tabla
     */
    private void eliminar() {
        int selected = JOptionPane.showConfirmDialog(this, "¿Esta seguro?", "Confirmar", JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);
        if (selected == 0) {
            ExNihilo.eliminarNota(nota);
        }
    }

    /**
     * Inicia la JTable
     */
    private void createUIComponents() {
        table = new JTable(new DefaultTableModel(new String[]{"Nota"}, 0));
    }
}
