package com.ryuuji.visual.cZone.asignatura;

import com.ryuuji.visual.cZone.CZone;
import logica.ExNihilo;
import logica.Listas;
import logica.Search;
import orm.Actividad;
import orm.Asignatura;
import orm.Curso;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class AnalizarAsignaturas extends JFrame {
    private JTable asignaturasTable;
    private JPanel mainPanel;
    private JTable planificacionTable;
    private JComboBox<String> cursoBox;
    private JButton modificarAsignaturaButton;
    private JButton eliminarAsignaturaButton;
    private JButton crearAsignaturaButton;
    private JButton salirButton;
    private JButton crearActividadButton;
    private JButton modificarActividadButton;
    private JButton eliminarActividadButton;
    private JLabel errorAsignatura;
    private JLabel errorActividad;

    private Curso curso;
    private Asignatura asignatura;
    private Actividad actividad;

    /**
     * Inicia la ventana y asigna los valores basicos, ademas llama a init()
     */
    public AnalizarAsignaturas() {
        setTitle("Analizar Asignatura");
        setContentPane(mainPanel);
        setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        addWindowListener(
                new WindowAdapter() {
                    @Override
                    public void windowClosing(WindowEvent e) {
                        new CZone();
                        dispose();
                    }
                }
        );
        setResizable(false);
        init();
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    /**
     * llama a los metodos setListeners(), fillCursos(), setCursos() y fillAsignaturas()
     */
    public void init() {
        setListeners();
        fillCursos();
        setCurso();
        fillAsignaturas();
    }

    /**
     * Asigna los listeners de los botones de la ventana, ademas de a las tablas cuando se seleccione un elemento
     */
    public void setListeners() {
        asignaturasTable.getSelectionModel().addListSelectionListener(a -> {
            errorAsignatura.setVisible(false);
            errorActividad.setVisible(false);
            setAsignatura();
            fillPlanificacion();
            setActividad();
        });
        cursoBox.addActionListener(a -> {
            errorAsignatura.setVisible(false);
            errorActividad.setVisible(false);
            setCurso();
            fillAsignaturas();
            setAsignatura();
            fillPlanificacion();
            setActividad();
        });
        planificacionTable.getSelectionModel().addListSelectionListener(a -> {
            errorAsignatura.setVisible(false);
            errorActividad.setVisible(false);
            setActividad();
        });
        salirButton.addActionListener(a -> {
            new CZone();
            dispose();
        });
        eliminarAsignaturaButton.addActionListener(a -> {
            errorAsignatura.setVisible(false);
            errorActividad.setVisible(false);
            if (asignatura != null) {
                int selected = JOptionPane.showConfirmDialog(this, "¿Esta seguro?", "Confirmar", JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);
                if (selected == 0) {
                    ExNihilo.eliminarAsignatura(asignatura);
                    fillAsignaturas();
                }
            } else {
                errorAsignatura.setVisible(true);
            }
        });
        eliminarActividadButton.addActionListener(a -> {
            errorAsignatura.setVisible(false);
            errorActividad.setVisible(false);
            if (actividad != null) {
                int selected = JOptionPane.showConfirmDialog(this, "¿Esta seguro?", "Confirmar", JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);
                if (selected == 0) {
                    ExNihilo.eliminarActividad(actividad);
                    fillPlanificacion();
                }
            } else {
                errorActividad.setVisible(true);
            }
        });
        crearActividadButton.addActionListener(a -> {
            errorAsignatura.setVisible(false);
            errorActividad.setVisible(false);
            if (asignatura != null) {
                new ActividadCrear(asignatura, this);
            } else {
                errorAsignatura.setVisible(true);
            }
        });
        crearAsignaturaButton.addActionListener(a -> {
            errorAsignatura.setVisible(false);
            errorActividad.setVisible(false);
            new CrearAsignatura(this);
        });
        modificarActividadButton.addActionListener(a -> {
            errorAsignatura.setVisible(false);
            errorActividad.setVisible(false);
            if (actividad != null) {
                new ActividadModificar(actividad, this);
            } else {
                errorActividad.setVisible(true);
            }
        });
        modificarAsignaturaButton.addActionListener(a -> {
            errorAsignatura.setVisible(false);
            errorActividad.setVisible(false);
            if (asignatura != null) {
                new AsignaturaModificar(this, asignatura);
            } else {
                errorAsignatura.setVisible(true);
            }
        });
    }

    /**
     * Llena el combo box de cursos con los cursos de la base de datos
     */
    public void fillCursos() {
        String[] cursos = Listas.listaCursos();
        cursoBox.removeAllItems();
        if (cursos != null) {
            for (String curso : cursos) {
                cursoBox.addItem(curso);
            }
        }
    }

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

    /**
     * Llena la tabla de asignaturas con todas las asignaturas correspondientes al curso seleccionado
     */
    public void fillAsignaturas() {
        String[][] asignaturas = Listas.listaAsignaturasProfesor(curso);
        DefaultTableModel model = (DefaultTableModel) asignaturasTable.getModel();
        model.setRowCount(0);
        if (asignaturas != null) {
            for (String[] asignatura : asignaturas) {
                model.addRow(asignatura);
            }
        }
    }

    /**
     * Almacena la asignatura que esta seleccionada en la tabla
     */
    private void setAsignatura() {
        asignatura = null;
        if (asignaturasTable.getSelectedRow() >= 0) {
            asignatura = Search.buscarAsignatura(
                    (String) asignaturasTable.getValueAt(asignaturasTable.getSelectedRow(), 0), curso);

        }
    }

    /**
     * Llena la tabla de planificaciones con las actividades que hay en esa asignatura.
     */
    public void fillPlanificacion() {
        String[][] actividades = Listas.listaActividades(asignatura);
        DefaultTableModel model = (DefaultTableModel) planificacionTable.getModel();
        model.setRowCount(0);
        if (actividades != null) {
            for (String[] actividad : actividades) {
                model.addRow(actividad);
            }
        }
    }

    /**
     * Almacena la actividad seleccionada en la tabla de planificaciones.
     */
    private void setActividad() {
        actividad = null;
        if (planificacionTable.getSelectedRow() >= 0) {
            SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
            try {
                Date fecha =
                        format.parse((String) planificacionTable.getValueAt(planificacionTable.getSelectedRow(), 0));
                String tipo = (String) planificacionTable.getValueAt(planificacionTable.getSelectedRow(), 1);
                actividad = Search.buscarActividad(asignatura, fecha, tipo);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * Inicia las tablas
     */
    private void createUIComponents() {
        asignaturasTable = new JTable(new DefaultTableModel(new String[]{"Nombre", "Profesor"}, 0) {
            @Override
            public boolean isCellEditable(int row, int column) {
                //all cells false
                return false;
            }
        });
        asignaturasTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        planificacionTable = new JTable(new DefaultTableModel(new String[]{"Actividad", "Fecha"}, 0) {
            @Override
            public boolean isCellEditable(int row, int column) {
                //all cells false
                return false;
            }
        });
        planificacionTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    }
}
