package examenes.examen20250509.vista;

import javax.swing.*;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;

import examenes.examen20250509.controlador.ControladorConcierto;
import examenes.examen20250509.controlador.ControladorGrupo;
import examenes.examen20250509.controlador.ControladorSala;
import examenes.examen20250509.modelo.Concierto;
import examenes.examen20250509.modelo.Grupo;
import examenes.examen20250509.modelo.Sala;

import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.awt.Color;

public class GestionConciertos extends JPanel {

    private static final long serialVersionUID = 1L;
    private Concierto conciertoActual;

    private JTextField tfFecha;
    private JTextField tfPrecio;
    private JComboBox<Grupo> comboBoxGrupo;
    private JComboBox<Sala> comboBoxSala;
    private JCheckBox checkBoxFestival;
    private JLabel mensajePrecio;
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    /**
     * Create the panel.
     */
    public GestionConciertos() {
        setLayout(new BorderLayout(0, 0));

        JPanel panel = new JPanel();
        GridBagLayout gridBagLayout = new GridBagLayout();
        gridBagLayout.columnWidths = new int[]{0, 0, 0};
        gridBagLayout.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0};
        gridBagLayout.columnWeights = new double[]{0.0, 1.0, Double.MIN_VALUE};
        gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
        panel.setLayout(gridBagLayout);
        add(panel);


        JLabel lblNewLabel = new JLabel("Fecha:");
        GridBagConstraints gbc_lblNewLabel = new GridBagConstraints();
        gbc_lblNewLabel.insets = new Insets(0, 0, 5, 5);
        gbc_lblNewLabel.anchor = GridBagConstraints.EAST;
        gbc_lblNewLabel.gridx = 0;
        gbc_lblNewLabel.gridy = 0;
        panel.add(lblNewLabel, gbc_lblNewLabel);

        tfFecha = new JTextField();
        GridBagConstraints gbc_textField = new GridBagConstraints();
        gbc_textField.insets = new Insets(0, 0, 5, 5);
        gbc_textField.fill = GridBagConstraints.HORIZONTAL;
        gbc_textField.gridx = 1;
        gbc_textField.gridy = 0;
        panel.add(tfFecha, gbc_textField);
        tfFecha.setColumns(10);

        JLabel lblNewLabel_1 = new JLabel("Precio:");
        GridBagConstraints gbc_lblNewLabel_1 = new GridBagConstraints();
        gbc_lblNewLabel_1.insets = new Insets(0, 0, 5, 5);
        gbc_lblNewLabel_1.anchor = GridBagConstraints.EAST;
        gbc_lblNewLabel_1.gridx = 0;
        gbc_lblNewLabel_1.gridy = 1;
        panel.add(lblNewLabel_1, gbc_lblNewLabel_1);

        checkBoxFestival = new JCheckBox("");
        checkBoxFestival.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                establecerCheckbox(checkBoxFestival.isSelected());
            }
        });

        tfPrecio = new JTextField();
        GridBagConstraints gbc_textField_1 = new GridBagConstraints();
        gbc_textField_1.insets = new Insets(0, 0, 5, 5);
        gbc_textField_1.fill = GridBagConstraints.HORIZONTAL;
        gbc_textField_1.gridx = 1;
        gbc_textField_1.gridy = 1;
        panel.add(tfPrecio, gbc_textField_1);
        tfPrecio.setColumns(10);

        mensajePrecio = new JLabel("");
        mensajePrecio.setForeground(new Color(169, 0, 0));
        GridBagConstraints gbc_mensajePrecio = new GridBagConstraints();
        gbc_mensajePrecio.anchor = GridBagConstraints.WEST;
        gbc_mensajePrecio.insets = new Insets(0, 0, 5, 5);
        gbc_mensajePrecio.gridx = 1;
        gbc_mensajePrecio.gridy = 2;
        panel.add(mensajePrecio, gbc_mensajePrecio);

        checkBoxFestival.setHorizontalAlignment(SwingConstants.LEFT);
        GridBagConstraints gbc_chckbxNewCheckBox = new GridBagConstraints();
        gbc_chckbxNewCheckBox.insets = new Insets(0, 0, 5, 5);
        gbc_chckbxNewCheckBox.anchor = GridBagConstraints.WEST;
        gbc_chckbxNewCheckBox.gridx = 1;
        gbc_chckbxNewCheckBox.gridy = 3;
        panel.add(checkBoxFestival, gbc_chckbxNewCheckBox);

        JLabel lblNewLabel_2 = new JLabel("Sala:");
        GridBagConstraints gbc_lblNewLabel_2 = new GridBagConstraints();
        gbc_lblNewLabel_2.insets = new Insets(0, 0, 5, 5);
        gbc_lblNewLabel_2.anchor = GridBagConstraints.EAST;
        gbc_lblNewLabel_2.gridx = 0;
        gbc_lblNewLabel_2.gridy = 4;
        panel.add(lblNewLabel_2, gbc_lblNewLabel_2);

        comboBoxSala = new JComboBox<>();
        GridBagConstraints gbc_comboBox = new GridBagConstraints();
        gbc_comboBox.insets = new Insets(0, 0, 5, 5);
        gbc_comboBox.fill = GridBagConstraints.HORIZONTAL;
        gbc_comboBox.gridx = 1;
        gbc_comboBox.gridy = 4;
        panel.add(comboBoxSala, gbc_comboBox);

        JLabel lblNewLabel_3 = new JLabel("Grupo:");
        GridBagConstraints gbc_lblNewLabel_3 = new GridBagConstraints();
        gbc_lblNewLabel_3.insets = new Insets(0, 0, 0, 5);
        gbc_lblNewLabel_3.anchor = GridBagConstraints.EAST;
        gbc_lblNewLabel_3.gridx = 0;
        gbc_lblNewLabel_3.gridy = 5;
        panel.add(lblNewLabel_3, gbc_lblNewLabel_3);

        comboBoxGrupo = new JComboBox<>();
        GridBagConstraints gbc_comboBox_1 = new GridBagConstraints();
        gbc_comboBox_1.insets = new Insets(0, 0, 0, 5);
        gbc_comboBox_1.fill = GridBagConstraints.HORIZONTAL;
        gbc_comboBox_1.gridx = 1;
        gbc_comboBox_1.gridy = 5;
        panel.add(comboBoxGrupo, gbc_comboBox_1);

        JPanel panel_1 = new JPanel();
        add(panel_1, BorderLayout.NORTH);

        JButton btnNewButton = new JButton("<<");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                mensajePrecio.setText("");
                setConcierto(ControladorConcierto.getFirstConcierto());
            }
        });
        panel_1.add(btnNewButton);

        JButton btnNewButton_1 = new JButton("<");
        btnNewButton_1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                mensajePrecio.setText("");
                setConcierto(ControladorConcierto.getAnteriorConcierto(conciertoActual));
            }
        });
        panel_1.add(btnNewButton_1);

        JButton btnNewButton_2 = new JButton(">");
        btnNewButton_2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                mensajePrecio.setText("");
                setConcierto(ControladorConcierto.getSiguienteConcierto(conciertoActual));
            }
        });
        panel_1.add(btnNewButton_2);

        JButton btnNewButton_3 = new JButton(">>");
        btnNewButton_3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                mensajePrecio.setText("");
                setConcierto(ControladorConcierto.getLastConcierto());
            }
        });
        panel_1.add(btnNewButton_3);

        JSeparator separator = new JSeparator();
        panel_1.add(separator);

        JButton btnNewButton_4 = new JButton("Nuevo");
        btnNewButton_4.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                nuevoConcierto();
            }
        });
        panel_1.add(btnNewButton_4);

        JButton btnNewButton_5 = new JButton("Guardar");
        btnNewButton_5.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                guardarConcierto();
            }
        });
        panel_1.add(btnNewButton_5);

        JButton btnNewButton_6 = new JButton("Eliminar");
        btnNewButton_6.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                eliminarConcierto();
            }
        });
        panel_1.add(btnNewButton_6);

        cargarAlInicio();
    }

    private void cargarAlInicio() {
        setConcierto(ControladorConcierto.getFirstConcierto());

        List<Sala> salas = ControladorSala.getAllSalas();
        for (Sala s : salas) {
            comboBoxSala.addItem(s);
        }
        List<Grupo> grupos = ControladorGrupo.getAllGrupos();
        for (Grupo g : grupos) {
            comboBoxGrupo.addItem(g);
        }

    }

    private void setConcierto(Concierto c) {
        conciertoActual = c;
        tfFecha.setText(c.getFecha().toString());
        tfPrecio.setText(String.valueOf(c.getPrecio()));
        establecerCheckbox(c.isEs_festival());


        comboBoxSala.removeAllItems();
        List<Sala> salas = ControladorSala.getAllSalas();
        for (Sala s : salas) {
            comboBoxSala.addItem(s);
            if (c.getSala_id() == s.getId()) {
                comboBoxSala.setSelectedItem(s);
            }
        }

        comboBoxGrupo.removeAllItems();
        List<Grupo> grupos = ControladorGrupo.getAllGrupos();
        for (Grupo g : grupos) {
            comboBoxGrupo.addItem(g);
            if (c.getSala_id() == g.getId()) {
                comboBoxGrupo.setSelectedItem(g);
            }
        }

    }

    private void establecerCheckbox(boolean b) {
        if (b) {
            checkBoxFestival.setText("Es Festival");
        } else {
            checkBoxFestival.setText("No es Festival");
        }
        checkBoxFestival.setSelected(b);
    }

    private void guardarConcierto() {

        if (Float.valueOf(tfPrecio.getText()) >= 0 && Float.valueOf(tfPrecio.getText()) <= 999.99) {
            mensajePrecio.setText("");
            try {
                Concierto concierto = new Concierto(
                        conciertoActual.getId(),
                        sdf.parse(tfFecha.getText()),
                        Float.valueOf(tfPrecio.getText()),
                        checkBoxFestival.isSelected(),
                        ((Sala) comboBoxSala.getSelectedItem()).getId(),
                        ((Grupo) comboBoxGrupo.getSelectedItem()).getId()
                );
                ControladorConcierto.guardarConcierto(concierto);
            } catch (ParseException e) {
                //throw new RuntimeException(e);
            }
        } else {
            mensajePrecio.setText("El precio es incorrecto. Debe estar entre 0 y 999.99");
        }
    }

    private void nuevoConcierto() {
        Concierto nuevo = new Concierto(
                -1,
                new Date(),
                0,
                false,
                -1,
                -1
        );

        tfFecha.setText(sdf.format(nuevo.getFecha()));
        tfPrecio.setText(String.valueOf(nuevo.getPrecio()));
        establecerCheckbox(nuevo.isEs_festival());
        comboBoxSala.setSelectedIndex(-1);
        comboBoxGrupo.setSelectedIndex(-1);

        conciertoActual = nuevo;
    }

    private void eliminarConcierto() {
        if (JOptionPane.showConfirmDialog(this, "¿Desea borrar el registro?", "¿Está seguro?", JOptionPane.YES_NO_OPTION) != 0) {
            return;
        }

        Concierto conciertoSiguiente = ControladorConcierto.getSiguienteConcierto(conciertoActual);
        Concierto conciertoAnterior = ControladorConcierto.getAnteriorConcierto(conciertoActual);

        int resultado = ControladorConcierto.borrarConcierto(conciertoActual);
        if (resultado > 0) {
            if (conciertoSiguiente != null) {
                setConcierto(conciertoSiguiente);
            } else if (conciertoAnterior != null) {
                setConcierto(conciertoAnterior);
            } else {
                nuevoConcierto();
            }
        }
    }

}
