package com.ryuuji.visual.cZone.asignatura;

import logica.ExNihilo;
import logica.Listas;
import logica.Search;
import orm.Asignatura;
import orm.Curso;
import orm.Profesor;

import javax.swing.*;

public class AsignaturaModificar extends JFrame {
    private Asignatura asignatura;
    private AnalizarAsignaturas analizarAsignaturas;
    private JPanel mainPanel;
    private JTextField nombreField;
    private JComboBox cursoBox;
    private JComboBox profesorBox;
    private JButton modificarButton;
    private JLabel errorVacio1;
    private JLabel errorVacio2;
    private JLabel errorVacio3;
    private JLabel errorExiste;
    private Curso curso;
    private Profesor profesor;

    /**
     * Inicia la ventana.
     * @param analizarAsignaturas lo almacena para mas tarde actualizar las tablas de la ventana
     * @param asignatura Asignatura la cual se modificara.
     */
    public AsignaturaModificar(AnalizarAsignaturas analizarAsignaturas, Asignatura asignatura) {
        this.asignatura = asignatura;
        this.analizarAsignaturas = analizarAsignaturas;
        setTitle("Modificar Asignatura");
        setContentPane(mainPanel);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        setResizable(false);
        init();
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    /**
     * Llena los textfields y llama a fillcurso, fillprofesor y setlistners
     */
    public void init() {
        nombreField.setText(asignatura.getNombre());
        fillCurso();
        cursoBox.setSelectedItem(asignatura.getCurso_id_fk().getNivel() + "-" + asignatura.getCurso_id_fk().getLetra());
        fillProfesor();
        profesorBox.setSelectedItem(asignatura.getProfesor_id_fk().getRut());
        setListeners();
    }

    /**
     * Inicia el listener de modificarButton.
     */
    public void setListeners() {
        modificarButton.addActionListener(a -> {
            errorVacio1.setVisible(false);
            errorVacio2.setVisible(false);
            errorVacio3.setVisible(false);
            errorExiste.setVisible(false);
            if (comprobar()) {
                modificar();
                analizarAsignaturas.fillAsignaturas();
                dispose();
            }
            pack();
        });
    }

    /**
     * Llena el box de cursos.
     */
    public void fillCurso() {
        String[] cursos = Listas.listaCursos();
        cursoBox.removeAllItems();
        if (cursos != null) {
            for (String curso : cursos) {
                cursoBox.addItem(curso);
            }
        }
    }

    /**
     * llena el box con los ruts de profesores
     */
    public void fillProfesor() {
        String[] profesores = Listas.listaProfesor();
        profesorBox.removeAllItems();
        if (profesores != null) {
            for (String profesor : profesores) {
                profesorBox.addItem(profesor);
            }
        }
    }

    /**
     * Almacena el curso seleccionado en el combobox de curso.
     */
    public void setCurso() {
        curso = null;
        String selected = (String) cursoBox.getSelectedItem();
        if (selected != null) {
            int nivel = Integer.parseInt(selected.split("-")[0]);
            String letra = selected.split("-")[1];
            curso = Search.buscarCurso(nivel, letra);
        }
    }

    /**
     * Almacena el profesor seleccionado el combobox de profesor
     */
    public void setProfesor() {
        profesor = null;
        String selected = (String) profesorBox.getSelectedItem();
        if (selected != null) {
            profesor = Search.buscarProfesor(selected);
        }
    }

    /**
     * Comprueba los datos ingresados, si hay algun dato erroneo mostrara el mensaje de error correspondiente en la ventana
     * @return un booleano indicando si los datos son correctos o no.
     */
    public boolean comprobar() {
        boolean vacio1 = nombreField.getText().trim().isEmpty();
        boolean vacio2 = cursoBox.getSelectedItem() == null;
        boolean vacio3 = profesorBox.getSelectedItem() == null;
        if (!vacio1 && !vacio2 && !vacio3) {
            setCurso();
            boolean existe = Search.buscarAsignatura(nombreField.getText(), curso) != null;
            if (!existe) {
                setProfesor();
                return true;
            } else {
                errorExiste.setVisible(true);
            }
        } else {
            if (vacio1) {
                errorVacio1.setVisible(true);
            }
            if (vacio2) {
                errorVacio2.setVisible(true);
            }
            if (vacio3) {
                errorVacio3.setVisible(true);
            }
        }
        return false;
    }

    /**
     * Modifica la asignatura con los datos seleccionados.
     */
    public void modificar() {
        ExNihilo.modificarAsignatura(asignatura, nombreField.getText(), curso, profesor);
    }
}
