package tutorialJava.examenes.examen20250509.vista;

import javax.swing.JPanel;
import java.awt.BorderLayout;
import javax.swing.JToolBar;
import javax.swing.JButton;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import javax.swing.JCheckBox;
import javax.swing.JTextField;
import javax.swing.JComboBox;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.awt.event.ActionEvent;
import tutorialJava.examenes.examen20250509.modelo.Concierto;
import tutorialJava.examenes.examen20250509.modelo.Grupo;
import tutorialJava.examenes.examen20250509.modelo.Sala;
import tutorialJava.examenes.examen20250509.controlador.ControladorConcierto;
import tutorialJava.examenes.examen20250509.controlador.ControladorGrupo;
import tutorialJava.examenes.examen20250509.controlador.ControladorSala;

public class PanelGestionConciertos extends JPanel {

	private static final long serialVersionUID = 1L;
	private JTextField jtfId;
	private JTextField jtfFecha;
	private JTextField jtfPrecio;
	JComboBox jcbGrupo;
	JComboBox jcbSala;
	JCheckBox checkEsFestival;
	SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	JLabel lblErrorEnPrecio;


	/**
	 * Create the panel.
	 */
	public PanelGestionConciertos() {
		setLayout(new BorderLayout(0, 0));
		
		JToolBar toolBar = new JToolBar();
		add(toolBar, BorderLayout.NORTH);
		
		JButton btnPrimero = new JButton("");
		btnPrimero.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Concierto c = ControladorConcierto.getPrimero();
				mostrarConciertoEnPantalla(c);
			}
		});
		btnPrimero.setIcon(new ImageIcon(PanelGestionConciertos.class.getResource("/tutorialJava/capitulo9_AWT_SWING/res/gotostart.png")));
		toolBar.add(btnPrimero);
		
		JButton btnAnterior = new JButton("");
		btnAnterior.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				int idActual = Integer.parseInt(jtfId.getText());
				mostrarConciertoEnPantalla(
						ControladorConcierto.getAnterior(idActual));
			}
		});
		btnAnterior.setIcon(new ImageIcon(PanelGestionConciertos.class.getResource("/tutorialJava/capitulo9_AWT_SWING/res/previous.png")));
		toolBar.add(btnAnterior);
		
		JButton btnSiguiente = new JButton("");
		btnSiguiente.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				int idActual = Integer.parseInt(jtfId.getText());
				mostrarConciertoEnPantalla(
						ControladorConcierto.getSiguiente(idActual));
			}
		});
		btnSiguiente.setIcon(new ImageIcon(PanelGestionConciertos.class.getResource("/tutorialJava/capitulo9_AWT_SWING/res/next.png")));
		toolBar.add(btnSiguiente);
		
		JButton btnUltimo = new JButton("");
		btnUltimo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				mostrarConciertoEnPantalla(ControladorConcierto.getUltimo());
			}
		});
		btnUltimo.setIcon(new ImageIcon(PanelGestionConciertos.class.getResource("/tutorialJava/capitulo9_AWT_SWING/res/gotoend.png")));
		toolBar.add(btnUltimo);
		
		JButton btnNuevo = new JButton("");
		btnNuevo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				nuevo();
			}
		});
		btnNuevo.setIcon(new ImageIcon(PanelGestionConciertos.class.getResource("/tutorialJava/capitulo9_AWT_SWING/res/nuevo.png")));
		toolBar.add(btnNuevo);
		
		JButton btnGuardar = new JButton("");
		btnGuardar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				guardar();
			}
		});
		btnGuardar.setIcon(new ImageIcon(PanelGestionConciertos.class.getResource("/tutorialJava/capitulo9_AWT_SWING/res/guardar.png")));
		toolBar.add(btnGuardar);
		
		JButton btnEliminar = new JButton("");
		btnEliminar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				eliminar();
			}
		});
		btnEliminar.setIcon(new ImageIcon(PanelGestionConciertos.class.getResource("/tutorialJava/capitulo9_AWT_SWING/res/eliminar.png")));
		toolBar.add(btnEliminar);
		
		JPanel panel = new JPanel();
		add(panel, BorderLayout.CENTER);
		GridBagLayout gbl_panel = new GridBagLayout();
		gbl_panel.columnWidths = new int[]{0, 0, 0};
		gbl_panel.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0};
		gbl_panel.columnWeights = new double[]{0.0, 1.0, Double.MIN_VALUE};
		gbl_panel.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
		panel.setLayout(gbl_panel);
		
		JLabel lblNewLabel = new JLabel("Id:");
		GridBagConstraints gbc_lblNewLabel = new GridBagConstraints();
		gbc_lblNewLabel.anchor = GridBagConstraints.EAST;
		gbc_lblNewLabel.insets = new Insets(0, 0, 5, 5);
		gbc_lblNewLabel.gridx = 0;
		gbc_lblNewLabel.gridy = 0;
		panel.add(lblNewLabel, gbc_lblNewLabel);
		
		jtfId = new JTextField();
		jtfId.setEnabled(false);
		GridBagConstraints gbc_jtfId = new GridBagConstraints();
		gbc_jtfId.insets = new Insets(0, 0, 5, 0);
		gbc_jtfId.fill = GridBagConstraints.HORIZONTAL;
		gbc_jtfId.gridx = 1;
		gbc_jtfId.gridy = 0;
		panel.add(jtfId, gbc_jtfId);
		jtfId.setColumns(10);
		
		JLabel lblNewLabel_1 = new JLabel("Fecha:");
		GridBagConstraints gbc_lblNewLabel_1 = new GridBagConstraints();
		gbc_lblNewLabel_1.anchor = GridBagConstraints.EAST;
		gbc_lblNewLabel_1.insets = new Insets(0, 0, 5, 5);
		gbc_lblNewLabel_1.gridx = 0;
		gbc_lblNewLabel_1.gridy = 1;
		panel.add(lblNewLabel_1, gbc_lblNewLabel_1);
		
		jtfFecha = new JTextField();
		GridBagConstraints gbc_jtfFecha = new GridBagConstraints();
		gbc_jtfFecha.insets = new Insets(0, 0, 5, 0);
		gbc_jtfFecha.fill = GridBagConstraints.HORIZONTAL;
		gbc_jtfFecha.gridx = 1;
		gbc_jtfFecha.gridy = 1;
		panel.add(jtfFecha, gbc_jtfFecha);
		jtfFecha.setColumns(10);
		
		JLabel lblNewLabel_2 = new JLabel("Precio");
		GridBagConstraints gbc_lblNewLabel_2 = new GridBagConstraints();
		gbc_lblNewLabel_2.anchor = GridBagConstraints.EAST;
		gbc_lblNewLabel_2.insets = new Insets(0, 0, 5, 5);
		gbc_lblNewLabel_2.gridx = 0;
		gbc_lblNewLabel_2.gridy = 2;
		panel.add(lblNewLabel_2, gbc_lblNewLabel_2);
		
		jtfPrecio = new JTextField();
		GridBagConstraints gbc_jtfPrecio = new GridBagConstraints();
		gbc_jtfPrecio.insets = new Insets(0, 0, 5, 0);
		gbc_jtfPrecio.fill = GridBagConstraints.HORIZONTAL;
		gbc_jtfPrecio.gridx = 1;
		gbc_jtfPrecio.gridy = 2;
		panel.add(jtfPrecio, gbc_jtfPrecio);
		jtfPrecio.setColumns(10);
		
		lblErrorEnPrecio = new JLabel("");
		GridBagConstraints gbc_lblErrorEnPrecio = new GridBagConstraints();
		gbc_lblErrorEnPrecio.anchor = GridBagConstraints.WEST;
		gbc_lblErrorEnPrecio.insets = new Insets(0, 0, 5, 0);
		gbc_lblErrorEnPrecio.gridx = 1;
		gbc_lblErrorEnPrecio.gridy = 3;
		panel.add(lblErrorEnPrecio, gbc_lblErrorEnPrecio);
		
		checkEsFestival = new JCheckBox("New check box");
		GridBagConstraints gbc_checkEsFestival = new GridBagConstraints();
		gbc_checkEsFestival.anchor = GridBagConstraints.WEST;
		gbc_checkEsFestival.insets = new Insets(0, 0, 5, 0);
		gbc_checkEsFestival.gridx = 1;
		gbc_checkEsFestival.gridy = 4;
		panel.add(checkEsFestival, gbc_checkEsFestival);
		checkEsFestival.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				compruebaFestival();
			}
		});
		
		JLabel lblNewLabel_3 = new JLabel("Grupo:");
		GridBagConstraints gbc_lblNewLabel_3 = new GridBagConstraints();
		gbc_lblNewLabel_3.anchor = GridBagConstraints.EAST;
		gbc_lblNewLabel_3.insets = new Insets(0, 0, 5, 5);
		gbc_lblNewLabel_3.gridx = 0;
		gbc_lblNewLabel_3.gridy = 5;
		panel.add(lblNewLabel_3, gbc_lblNewLabel_3);
		
		jcbGrupo = new JComboBox();
		GridBagConstraints gbc_jcbGrupo = new GridBagConstraints();
		gbc_jcbGrupo.insets = new Insets(0, 0, 5, 0);
		gbc_jcbGrupo.fill = GridBagConstraints.HORIZONTAL;
		gbc_jcbGrupo.gridx = 1;
		gbc_jcbGrupo.gridy = 5;
		panel.add(jcbGrupo, gbc_jcbGrupo);
		
		JLabel lblNewLabel_4 = new JLabel("Sala:");
		GridBagConstraints gbc_lblNewLabel_4 = new GridBagConstraints();
		gbc_lblNewLabel_4.anchor = GridBagConstraints.EAST;
		gbc_lblNewLabel_4.insets = new Insets(0, 0, 0, 5);
		gbc_lblNewLabel_4.gridx = 0;
		gbc_lblNewLabel_4.gridy = 6;
		panel.add(lblNewLabel_4, gbc_lblNewLabel_4);
		
		jcbSala = new JComboBox();
		GridBagConstraints gbc_jcbSala = new GridBagConstraints();
		gbc_jcbSala.fill = GridBagConstraints.HORIZONTAL;
		gbc_jcbSala.gridx = 1;
		gbc_jcbSala.gridy = 6;
		panel.add(jcbSala, gbc_jcbSala);

		cargaTodosLosGrupos();
		cargaTodasLasSalas();
		
		mostrarConciertoEnPantalla(ControladorConcierto.getPrimero());
	}
	
	/**
	 * 
	 */
	private void compruebaFestival () {
		if (checkEsFestival.isSelected()) {
			checkEsFestival.setText("Es festival");
		}
		else {
			checkEsFestival.setText("No es festival");
		}
	}
	
	/**
	 * 
	 */
	private void cargaTodosLosGrupos() {
		List<Grupo> grupos = ControladorGrupo.findAll();
		for (Grupo g : grupos) {
			jcbGrupo.addItem(g);
		}
	}
	
	/**
	 * 
	 */
	private void cargaTodasLasSalas() {
		List<Sala> salas = ControladorSala.findAll();
		for (Sala s : salas) {
			jcbSala.addItem(s);
		}
	}
	
	/**
	 * 
	 * @param c
	 */
	private void mostrarConciertoEnPantalla(Concierto c) {
		if (c != null) {
			jtfId.setText("" + c.getId());
			jtfFecha.setText(sdf.format(c.getFecha()));
			jtfPrecio.setText("" + c.getPrecio());
			
			checkEsFestival.setSelected(c.isFestival());		
//			if (c.isFestival()) {
//				checkEsFestival.setSelected(true);
//			}
//			else {
//				checkEsFestival.setSelected(false);
//			}
			compruebaFestival();
			
			for (int i = 0; i < jcbGrupo.getItemCount(); i++) {
				Grupo grupoEnJCombo = (Grupo) jcbGrupo.getItemAt(i);
				if (grupoEnJCombo.getId() == c.getIdGrupo()) {
					jcbGrupo.setSelectedIndex(i);
				}
			}
			
			for (int i = 0; i < jcbSala.getItemCount(); i++) {
				Sala salaEnJCombo = (Sala) jcbSala.getItemAt(i);
				if (salaEnJCombo.getId() == c.getIdSala()) {
					jcbSala.setSelectedIndex(i);
				}
			}
		}
		
	}
	
	/**
	 * 
	 */
	private void guardar() {
		Concierto c = new Concierto();
		c.setId(Integer.parseInt(jtfId.getText()));
		try {
			c.setFecha(sdf.parse(jtfFecha.getText()));
		} catch (ParseException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, "El formato de la"
					+ " fecha debe ser dd/MM/yyyy");
			return;
		}
		
		float precioConcierto = Float.parseFloat(jtfPrecio.getText());
		if (precioConcierto < 0 || precioConcierto >= 1000) {
			lblErrorEnPrecio.setText("Precio debe estar entre 0 y 999.99");
			return;
		}
		else {
			lblErrorEnPrecio.setText("");
		}
		c.setPrecio(precioConcierto);
		
		c.setFestival(checkEsFestival.isSelected());
		
		Grupo g = (Grupo) jcbGrupo.getSelectedItem();
		c.setIdGrupo(g.getId());
		
		Sala s = (Sala) jcbSala.getSelectedItem();
		c.setIdSala(s.getId());
		
		int registrosAfectados = ControladorConcierto.guardar(c);
		if (registrosAfectados == 0) {
			JOptionPane.showMessageDialog(null, "Error al guardar");
		}
		else if (registrosAfectados == 1) {
			if (c.getId() == 0) { // Se trata de una inserción
				mostrarConciertoEnPantalla(ControladorConcierto.getUltimo());
			}
			JOptionPane.showMessageDialog(null, "Guardado correctamente");
		}
	}

	/**
	 * 
	 */
	private void nuevo() {
		jtfId.setText("0");
		jtfFecha.setText(sdf.format(new Date()));
		jtfPrecio.setText("0");
		checkEsFestival.setSelected(false);
		jcbGrupo.setSelectedIndex(0);
		jcbSala.setSelectedIndex(0);
	}
	
	/**
	 * 
	 */
	private void eliminar() {
		String [] opciones ={"Sí","No"};
		int eleccion = JOptionPane.showOptionDialog(null,
				"¿Desea eliminar el concierto?","Eliminar concierto",
		JOptionPane.YES_NO_OPTION,
		JOptionPane.QUESTION_MESSAGE, null, opciones, "Sí");
		if (eleccion != JOptionPane.YES_OPTION) {
			return;
		}

		
		int idConcierto = Integer.parseInt(jtfId.getText());
		int registrosAfectados = ControladorConcierto.eliminar(idConcierto);
		if (registrosAfectados == 0) {
			JOptionPane.showMessageDialog(null, "Error al eliminar");
		}
		else if (registrosAfectados == 1) {
			JOptionPane.showMessageDialog(null, "Eliminado correctamente");
			
			Concierto conciertoAnterior = 
					ControladorConcierto.getAnterior(idConcierto);
			// Si elimino correctamente, intento mostrar el anterior
			if (conciertoAnterior != null) {
				mostrarConciertoEnPantalla(conciertoAnterior);
			}
			else { // No existe un anterior, intento mostrar el siguiente
				Concierto conciertoSiguiente = 
						ControladorConcierto.getSiguiente(idConcierto);
				if (conciertoSiguiente != null) {
					mostrarConciertoEnPantalla(conciertoSiguiente);
				}
				else { // No tiene concierto anterior ni siguiente
					nuevo();
				}
			}
		}
	}
}








