package v;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JList;
import java.util.List;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JLabel;
import java.awt.event.ActionListener;
import java.sql.*;
import java.awt.event.ActionEvent;
import javax.swing.DefaultListModel;
import javax.swing.JOptionPane;

//Importation des différentes classes
import m.Entree;
import m.Plat;
import m.Dessert;
import m.Boisson;
import c.DBConnect;

public class Ihm extends JFrame {

	private JPanel contentPane;
	private JTextField txtFNumtable;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Ihm frame = new Ihm();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Ihm() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 1280, 720);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		
		//Instancie un objet laCommande regroupant tous les éléments d'une commande (entrées, plats, desserts et boissons) et que l'on affichera dans la listCommande
		DefaultListModel<String> laCommande = new DefaultListModel<>();
		

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(56, 105, 401, 496);
		contentPane.add(scrollPane);
		
		JList listCommande = new JList();
		scrollPane.setViewportView(listCommande);
		
		JButton btnEntree1 = new JButton("Entrée n° 1");
		//Instanciation d'une entree n°1
		Entree entree1 = new Entree("Entrée n°1", 4.99);
		String afficheentree1 = "Entrée : " + entree1.getNomEntree() + " - " + entree1.getPrixEntree() + "€"; //Passe l'objet entree1 dans une chaine de caractère pour faciliter l'affichage dans la JList
		btnEntree1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				laCommande.addElement(afficheentree1); // Ajoute l'entrée 1 au modèle laCommande
				listCommande.setModel(laCommande); //Attribue / lie le modèle laCommande à la liste listCommande
			}			
		});
		
		btnEntree1.setBounds(699, 105, 150, 100);
		contentPane.add(btnEntree1);
		
		JButton btnEntree2 = new JButton("Entrée n° 2");
		//Instanciation d'une entree n°2
		Entree entree2 = new Entree("Entrée n°2", 2.50);
		String afficheentree2 = "Entrée : " + entree2.getNomEntree() + " - " + entree2.getPrixEntree() + "€"; //Passe l'objet entree2 dans une chaine de caractère pour faciliter l'affichage dans la JList
		btnEntree2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				laCommande.addElement(afficheentree2); // Ajoute l'entrée 2 au modèle laCommande
				listCommande.setModel(laCommande); //Attribue / lie le modèle laCommande à la liste listCommande
			}
		});
		
		btnEntree2.setBounds(875, 105, 150, 100);
		contentPane.add(btnEntree2);
		
		JButton btnBoisson1 = new JButton("Boisson n° 1");
		//Instanciation d'une boisson n°1
		Boisson boisson1 = new Boisson("Boisson n°1", 2.0);
		String afficheBoisson1 = "Boisson : " + boisson1.getNomBoisson() + " - " + boisson1.getPrixBoisson() + "€"; //Passe l'objet boisson1 dans une chaine de caractère pour faciliter l'affichage dans la JList
		btnBoisson1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				laCommande.addElement(afficheBoisson1); // Ajoute la boisson1 au modèle laCommande
				listCommande.setModel(laCommande); //Attribue / lie le modèle laCommande à la liste listCommande
			}
		});
		
		btnBoisson1.setBounds(699, 237, 150, 100);
		contentPane.add(btnBoisson1);
		
		JButton btnBoisson2 = new JButton("Boisson n° 2");
		//Instanciation d'une boisson n°2
		Boisson boisson2 = new Boisson("Boisson n°2", 4.0);
		String afficheBoisson2 = "Boisson : " + boisson2.getNomBoisson() + " - " + boisson2.getPrixBoisson() + "€"; //Passe l'objet boisson2 dans une chaine de caractère pour faciliter l'affichage dans la JList
		btnBoisson2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				laCommande.addElement(afficheBoisson2); // Ajoute la boisson2 au modèle laCommande
				listCommande.setModel(laCommande); //Attribue / lie le modèle laCommande à la liste listCommande
			}
		});
		
		btnBoisson2.setBounds(875, 237, 150, 100);
		contentPane.add(btnBoisson2);
		
		JButton btnPlat1 = new JButton("Plat n° 1");
		//Instanciation d'un plat n°1
		Plat plat1 = new Plat("Plat n°1", 20.0);
		String affichePlat1 = "Plat : " + plat1.getNomPlat() + " - " + plat1.getPrixPlat() + "€"; //Passe l'objet plat1 dans une chaine de caractère pour faciliter l'affichage dans la JList
		btnPlat1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				laCommande.addElement(affichePlat1); // Ajoute le plat1 au modèle laCommande
				listCommande.setModel(laCommande); //Attribue / lie le modèle laCommande à la liste listCommande
			}
		});
		
		btnPlat1.setBounds(699, 371, 150, 100);
		contentPane.add(btnPlat1);
		
		JButton btnPlat2 = new JButton("Plat n° 2");
		//Instanciation d'un plat n°2
		Plat plat2 = new Plat("Plat n°2", 9.99);
		String affichePlat2 = "Plat : " + plat2.getNomPlat() + " - " + plat2.getPrixPlat() + "€"; //Passe l'objet plat2 dans une chaine de caractère pour faciliter l'affichage dans la JList
		btnPlat2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				laCommande.addElement(affichePlat2); // Ajoute le plat2 au modèle laCommande
				listCommande.setModel(laCommande); //Attribue / lie le modèle laCommande à la liste listCommande
			}
		});
		
		btnPlat2.setBounds(875, 371, 150, 100);
		contentPane.add(btnPlat2);
		
		JButton btnDessert1 = new JButton("Dessert n° 1");
		//Instanciation d'un dessert n°1
		Dessert dessert1 = new Dessert("Dessert n°1", 7.50);
		String afficheDessert1 = "Dessert : " + dessert1.getNomDessert() + " - " + dessert1.getPrixDessert() + "€"; //Passe l'objet dessert1 dans une chaine de caractère pour faciliter l'affichage dans la JList
		btnDessert1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				laCommande.addElement(afficheDessert1); // Ajoute le dessert 1 au modèle laCommande
				listCommande.setModel(laCommande); //Attribue / lie le modèle laCommande à la liste listCommande
			}
		});
		
		btnDessert1.setBounds(699, 501, 150, 100);
		contentPane.add(btnDessert1);
		
		JButton btnDessert2 = new JButton("Dessert n° 2");
		//Instanciation d'un dessert n°2
		Dessert dessert2 = new Dessert("Dessert n°2", 6.30);
		String afficheDessert2 = "Dessert : " + dessert2.getNomDessert() + " - " + dessert2.getPrixDessert() + "€"; //Passe l'objet dessert2 dans une chaine de caractère pour faciliter l'affichage dans la JList
		btnDessert2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				laCommande.addElement(afficheDessert2); // Ajoute le dessert 2 au modèle laCommande
				listCommande.setModel(laCommande); //Attribue / lie le modèle laCommande à la liste listCommande
			}
		});
		
		btnDessert2.setBounds(875, 501, 150, 100);
		contentPane.add(btnDessert2);
		
		txtFNumtable = new JTextField();
		txtFNumtable.setBounds(197, 62, 50, 25);
		contentPane.add(txtFNumtable);
		
		txtFNumtable.setColumns(10);
		
		//Récupère la saisie du numéro de table
		String numTable = txtFNumtable.getText();
		
		JLabel lblNumtable = new JLabel("Prise à la table n°");
		lblNumtable.setBounds(56, 67, 150, 15);
		contentPane.add(lblNumtable);
		
		JLabel lblprendrecommande = new JLabel("Prendre la commande");
		lblprendrecommande.setBounds(327, 11, 462, 50);
		contentPane.add(lblprendrecommande);
		
		JButton btnSupprimer = new JButton("Supprimer");
		btnSupprimer.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
					
					// Récupération de l'indice de l'élément sélectionné dans la liste listCommande
					int index = listCommande.getSelectedIndex();
					
					// Vérifier si l'utilisateur a bien sélectionné un élément dans la liste
					if (index != -1) {
						
						// Suppression de l'élément de la liste listCommande à l'indice index
						((DefaultListModel<String>)listCommande.getModel()).remove(index);
					}
			}
		});
		btnSupprimer.setBounds(56, 620, 150, 50);
		contentPane.add(btnSupprimer);
		
		JButton btnCommander = new JButton("Commander");
		btnCommander.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				//Récupère chaque élément
				List<Object> elements = new ArrayList<>();
				for (int i = 0; i < listCommande.getModel().getSize(); i++) {
					
				    Object element = listCommande.getModel().getElementAt(i);
				    elements.add(element);
				} 
					
				//Contrôle de saisie pour vérifier si un numéro de table est renseigné
				if (txtFNumtable.getText().equals("")) {
					
					// Affiche un message d'erreur
					 JOptionPane.showMessageDialog(null,"Veuillez renseigner un numéro de table");
				} else {
					
					//Si un élément de la JList est une entree
					if (elements.contains("Entree : ")  && elements !=null) { 
						
						try {
							
							//Ouverture d'une connexion
							DBConnect.connexionBDD();
							
							//Appelle la procédure stockée
			                CallableStatement stmt = DBConnect.connexionBDD().prepareCall("{call enregistreEntree(nomentree, prixentree)}");
			                
			                // Récupère les paramètres de la procédure
			                Entree entree = (Entree) elements;
			                String nomentree = entree.getNomEntree();
			                double prixentree = entree.getPrixEntree();
			                // int numerotable = Integer.parseInt(numTable);
			                
			                // Affecte les paramètres à la procédure
			                stmt.setString(1, nomentree);
			                stmt.setDouble(2, prixentree);
			                
			                // Exécution de la procédure stockée
			                stmt.executeUpdate();
			                
			                // Fermeture de la connexion et du statement
			                stmt.close();
			                DBConnect.deconnexionBDD();
			                
			                JOptionPane.showMessageDialog(null, "La commande a bien été envoyée !");
							
							JOptionPane.showMessageDialog(null, "Erreur lors de l'envoi des données");
							
						} catch(SQLException ex) {
							
							ex.printStackTrace();
						}
					} else if (elements.contains("Plat : ")  && elements !=null) { 
						
						try {
							
							//Ouverture d'une connexion
							DBConnect.connexionBDD();
							
							//Appelle la procédure stockée
			                CallableStatement stmt = DBConnect.connexionBDD().prepareCall("{call enregistrePlat(nomplat, prixplat)}");
			                
			                // Récupère les paramètres de la procédure
			                Plat plat = (Plat) elements;
			                String nomplat = plat.getNomPlat();
			                double prixplat = plat.getPrixPlat();
			                
			                // Affecte les paramètres à la procédure
			                stmt.setString(1, nomplat);
			                stmt.setDouble(2, prixplat);
			                
			                // Exécution de la procédure stockée
			                stmt.executeUpdate();
			                
			                // Fermeture de la connexion et du statement
			                stmt.close();
			                DBConnect.deconnexionBDD();
			                
			                JOptionPane.showMessageDialog(null, "La commande a bien été envoyée !");
							
							JOptionPane.showMessageDialog(null, "Erreur lors de l'envoi des données");
							
						} catch(SQLException ex) {
							
							ex.printStackTrace();
						}
					} else if (elements.contains("Dessert : ")  && elements !=null) { 
						
						try {
							
							//Ouverture d'une connexion
							DBConnect.connexionBDD();
							
							//Appelle la procédure stockée
			                CallableStatement stmt = DBConnect.connexionBDD().prepareCall("{call enregistreDessert(nomdessert, prixdessert)}");
			                
			                // Récupère les paramètres de la procédure
			                Dessert dessert = (Dessert) elements;
			                String nomdessert = dessert.getNomDessert();
			                double prixdessert = dessert.getPrixDessert();
			                
			                // Affecte les paramètres à la procédure
			                stmt.setString(1, nomdessert);
			                stmt.setDouble(2, prixdessert);
			                
			                // Exécution de la procédure stockée
			                stmt.executeUpdate();
			                
			                // Fermeture de la connexion et du statement
			                stmt.close();
			                DBConnect.deconnexionBDD();
			                
			                JOptionPane.showMessageDialog(null, "La commande a bien été envoyée !");
							
							JOptionPane.showMessageDialog(null, "Erreur lors de l'envoi des données");
							
						} catch(SQLException ex) {
							
							ex.printStackTrace();
						}
					} else if (elements.contains("Boisson : ")  && elements !=null) { 
						
						try {
							
							//Ouverture d'une connexion
							DBConnect.connexionBDD();
							
							//Appelle la procédure stockée
			                CallableStatement stmt = DBConnect.connexionBDD().prepareCall("{call enregistreBoisson(nomboisson, prixboisson)}");
			                
			                // Récupère les paramètres de la procédure
			                Boisson boisson = (Boisson) elements;
			                String nomboisson = boisson.getNomBoisson();
			                double prixboisson = boisson.getPrixBoisson();
			                
			                // Affecte les paramètres à la procédure
			                stmt.setString(1, nomboisson);
			                stmt.setDouble(2, prixboisson);
			                
			                // Exécution de la procédure stockée
			                stmt.executeUpdate();
			                
			                // Fermeture de la connexion et du statement
			                stmt.close();
			                DBConnect.deconnexionBDD();
			                
			                JOptionPane.showMessageDialog(null, "La commande a bien été envoyée !");
							
							JOptionPane.showMessageDialog(null, "Erreur lors de l'envoi des données");
							
						} catch(SQLException ex) {
							
							ex.printStackTrace();
						}
					}
				}
			}
		});
		btnCommander.setBounds(307, 620, 150, 50);
		contentPane.add(btnCommander);
		
		JLabel lblEntrees = new JLabel("Entrées");
		lblEntrees.setBounds(699, 80, 150, 14);
		contentPane.add(lblEntrees);
		
		JLabel lblBoissons = new JLabel("Boissons");
		lblBoissons.setBounds(699, 216, 150, 14);
		contentPane.add(lblBoissons);
		
		JLabel lblPlats = new JLabel("Plats");
		lblPlats.setBounds(699, 348, 150, 14);
		contentPane.add(lblPlats);
		
		JLabel lblDesserts = new JLabel("Desserts");
		lblDesserts.setBounds(699, 482, 150, 14);
		contentPane.add(lblDesserts);
		
		JButton btnQuitter = new JButton("Quitter");
		btnQuitter.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				System.exit(0);
			}
		});
		btnQuitter.setBounds(1070, 620, 150, 50);
		contentPane.add(btnQuitter);
		
	}
}