package com.ryuuji.visual.cZone.asignatura;

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

import javax.swing.*;

public class CrearAsignatura extends JFrame {
    private final AnalizarAsignaturas analizarAsignaturas;
    private JPanel mainPanel;
    private JTextField nombreField;
    private JComboBox<String> cursoBox;
    private JComboBox<String> profesorBox;
    private JButton crearButton;
    private JLabel errorVacio1;
    private JLabel errorVacio2;
    private JLabel errorVacio3;
    private JLabel errorExiste;

    private Curso curso;
    private Profesor profesor;

    /**
     * Inicia los valores basicos de la ventana, ademas llama a init
     * @param analizarAsignaturas Almacena la ventana para actualizarla cuando se creen los datos
     */
    public CrearAsignatura(AnalizarAsignaturas analizarAsignaturas) {
        this.analizarAsignaturas = analizarAsignaturas;
        setTitle("Crear Asignatura");
        setContentPane(mainPanel);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        setResizable(false);
        init();
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    /**
     * llama a los metodos fillcurso, fillprofesor y setlisteners
     */
    public void init() {
        fillCurso();
        fillProfesor();
        setListeners();
    }

    /**
     * inicia el listener de crearbutton, el cual inicia la secuencia de creacion
     */
    public void setListeners() {
        crearButton.addActionListener(a -> {
            errorVacio1.setVisible(false);
            errorVacio2.setVisible(false);
            errorVacio3.setVisible(false);
            errorExiste.setVisible(false);
            if (comprobar()) {
                crear();
                analizarAsignaturas.fillAsignaturas();
                dispose();
            }
            pack();
        });
    }

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

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

    /**
     * Almacena el curso que estaba seleccionado en la combobox
     */
    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 en la combobox
     */
    public void setProfesor() {
        profesor = null;
        String selected = (String) profesorBox.getSelectedItem();
        if (selected != null) {
            profesor = Search.buscarProfesor(selected);
        }
    }

    /**
     * comprueba los datos ingresados y si ocurre algun error mostrara el mensaje correspondiente
     * @return un booleano indicando si la comprobacion fue correcta.
     */
    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;
    }

    /**
     * crea la asignatura con los datos ingresados.
     */
    public void crear() {
        ExNihilo.crearAsignatura(nombreField.getText(), curso, profesor);
    }
}
