/* programma di prova
questo programma  vi insegnerà a 
creare un form nella GUI e accedere e visualizzare
i dati 
*/


//librerie importate
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.swing.table.DefaultTableModel;
import java.awt.BorderLayout;

//classe principale
class SwingDemo1 { 

	//classe per gestione itemdata combobox
	public class ComboItem {
			private String key; // Il valore nascosto (ID, codice)
			private String value; // Il testo mostrato

		public ComboItem(String key, String value) {
			this.key = key;
			this.value = value;
		}

		public String getKey() {
			return key;
		}

		public String getValue() {
			return value;
		}

		// Questo è ciò che il JComboBox mostrerà
		@Override
		public String toString() {
			return value;
		}	
	}

	//modello classe swigdemo1
	SwingDemo1 () {

		//parametri per la connessione al database MYSQL
		String DB_URL = "jdbc:mysql://127.0.0.1:3306/marco";
		String USER = "root";
		String PASS = "AmUnAKTRA76@";

		
		// Crea un nuovo contenitore JFrame"Una semplice swing application"
		JFrame jfr = new JFrame("Una semplice swing application");
		
		//Fornisce le dimensioni iniziali della FRAME 
		jfr.setSize(800,600);

		//Fornisce la posizione sullo schermo della FRAME 
		jfr.setLocation(200,200);

		//Termina il programma quando l'utente chiude la finestra
		jfr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	
		//Crea una label che conterra' tutti gli elementi
		JLabel jlab = new JLabel("Hello world this is me");

		//specifico dimensioni iniziali e posizione
		jlab.setLocation(10,10);
		jlab.setSize(800,600);
		//La aggiungo al form
		jfr.add(jlab);

		//creazione tabella
		String[] columnNames = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"};
		Object[][] data = {
            {"Kathy", "Smith", "Snowboarding", 5, false},
            {"John", "Doe", "Rowing", 3, true},
            {"Sue", "Pauli", "Chasing", 2, false},
            {"Jane", "Doe", "Blacksmith", 20, true}
        };
		
		JTable table = new JTable(data, columnNames);
		
		//JScrollPane scrollPane = new JScrollPane(table); // Aggiunge la tabella a uno JScrollPane
        //jfr.add(scrollPane); // Aggiunge lo scroll pane al frame

		table.setSize(300,200);
		table.setLocation(300,300);
		
		// Optional: Make the table use the entire height of its container
		table.setFillsViewportHeight(true);


        // 1. Creazione componenti prima casella di testo
        JTextField campoTesto = new JTextField(20); // 20 colonne di larghezza
        campoTesto.setSize(200,20);
		campoTesto.setLocation(10,30);
		
        // 2. Creazione componenti seconda casella di testo
        JTextField campoTesto1 = new JTextField(20); // 20 colonne di larghezza
        campoTesto1.setSize(200,20);
		campoTesto1.setLocation(10,60);

		// 3. Creazione della prima combobox
		JComboBox<ComboItem> combo = new JComboBox<>();
		combo.setSize(200,20);
		combo.setLocation(10,100);

		// 4. creazione primo pulsante
		JButton bottone = new JButton("Saluta");
		bottone.setSize(100,60);
		bottone.setLocation(10,150);

		// 3. Creazione del terzo campo di testo
		JTextField campoTesto3 = new JTextField(20); // 20 colonne di larghezza
        campoTesto3.setSize(200,20);
		campoTesto3.setLocation(10,220);
		campoTesto3.setText("0");
		
		// 4. creazione secondo pulsante
		JButton bottone2 = new JButton("INSERIMENTO");
		bottone2.setSize(100,60);
		bottone2.setLocation(10,300);
	
		// 4. creazione TERZO  pulsante
		JButton bottone3 = new JButton("MODIFICA");
		bottone3.setSize(100,60);
		bottone3.setLocation(10,380);// 4. creazione secondo pulsante
		
		// 4. creazione quarto pulsante
		JButton bottone4 = new JButton("CANCELLAZIONE");
		bottone4.setSize(100,60);
		bottone4.setLocation(10,480);
	
	
		//aggiunta action lister per il primo bottone 
		bottone.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				//se si verifica l'evento visualizzo nel secondo testo un contenuto
				campoTesto1.setText(campoTesto.getText()+" Pippo");
			}
		});
		
		//aggiunta action lister per il combo box 
		combo.addActionListener(e -> {
			ComboItem selectedItem = (ComboItem) combo.getSelectedItem();
			if (selectedItem != null) {
				String idSelezionato = selectedItem.getKey();
				String testoSelezionato = selectedItem.getValue();
				campoTesto3.setText(idSelezionato);
				System.out.println("ID: " + idSelezionato + ", Testo: " + testoSelezionato);
			}
		});
		// carico la combo box con i valori della tab1 del database 
		try {		
		Connection conn = DriverManager.getConnection(DB_URL,USER,PASS); //parametri di connessione
        Statement stmt = conn.createStatement(); //creo uno statement usando la connessione
        ResultSet rs = stmt.executeQuery("SELECT * FROM tab1;"); //esegui la query al database
			System.out.println("Connessione al database riuscita!"); //se tutto ok stampo stato
			 // Processa il ResultSet
            while (rs.next()) { //per tutti i record contenuti nella query
                // popolo la combo box con il valori di riga del recordset
                //combo.addItem(new ComboItem("1", "Mela"));
				combo.addItem(new ComboItem(rs.getString("id"),rs.getString("nome")));
            }
		} catch (SQLException e) { //se errore stampo sullo schermo
			System.err.println("Errore di connessione al database:");
            e.printStackTrace();
		}

		//aggiunta action lister per il secondo bottone
		bottone2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {

			String sql2 = "INSERT INTO tab1 (nome) VALUES ( ? );"; //SQL di inserimento dati nel database
		
				try (Connection con = DriverManager.getConnection(DB_URL,USER,PASS);  //connetto al database
					PreparedStatement pstmt = con.prepareStatement(sql2)) {  //preparo SQL inserimento

					// Impostazione dei parametri mancanti
					pstmt.setString(1,campoTesto.getText()); // Primo '?'

					// Esecuzione dell'inserimento
					int righeInserite = pstmt.executeUpdate();
					System.out.println("Righe inserite: " + righeInserite); //numero di righe inserite
				} catch (SQLException e) {  //se errore lo stampo 
					e.printStackTrace();
				}
			}
		});
		//aggiunta action lister per il terzo bottone
		bottone3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {

			String sql2 = "update tab1 set nome=? where id="+campoTesto3.getText()+";"; //SQL di inserimento dati nel database
		
				try (Connection con = DriverManager.getConnection(DB_URL,USER,PASS);  //connetto al database
					PreparedStatement pstmt = con.prepareStatement(sql2)) {  //preparo SQL inserimento

					// Impostazione dei parametri mancanti
					pstmt.setString(1,campoTesto.getText()); // Primo '?'

					// Esecuzione dell'inserimento
					int righeInserite = pstmt.executeUpdate();
					System.out.println("Righe inserite: " + righeInserite); //numero di righe inserite
				} catch (SQLException e) {  //se errore lo stampo 
					e.printStackTrace();
				}
			}
		});
		//aggiunta action lister per il quarto bottone
		bottone4.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {

			String sql2 = "delete from tab1 where id= ? ;"; //SQL di inserimento dati nel database
		
				try (Connection con = DriverManager.getConnection(DB_URL,USER,PASS);  //connetto al database
					PreparedStatement pstmt = con.prepareStatement(sql2)) {  //preparo SQL inserimento

					// Impostazione dei parametri mancanti
					pstmt.setString(1,campoTesto3.getText()); // Primo '?'

					// Esecuzione dell'inserimento
					int righeInserite = pstmt.executeUpdate();
					System.out.println("Righe inserite: " + righeInserite); //numero di righe inserite
				} catch (SQLException e) {  //se errore lo stampo 
					e.printStackTrace();
				}
			}
		});

			
		// 2. Aggiunta componenti al pannellino label non al form 
				
        jlab.add(campoTesto);
		jlab.add(campoTesto1);
 		jlab.add(combo);
		jlab.add(bottone);
		jlab.add(campoTesto3);
		jlab.add(bottone2);
		jlab.add(bottone3);
		jlab.add(bottone4);
		jlab.add(table);
		// visualizza il form
		jfr.setVisible(true);

	}

	// chiamata a main
	public static void main(String args[]) {
		// Crea una frame sul thread di esecuzione evitando sovraccarico CPU
		SwingUtilities.invokeLater(new Runnable() {
			public void run ()	{
				new SwingDemo1();
			}
		});
	}
}