import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.sql.*;
/*
 *BddFrame est la partie graphique du projet
 * @author Juba Hamid et Adrien Taieb
 * @version 1
 */
public class BddFrame extends JFrame{
    static Graphics2D g;
    Texte [] textes;
	Bdd bdd;

    public BddFrame() {
    	bdd=new Bdd();
		setTitle("Voyages || "+date());
        setSize(new Dimension(1024,768));
    	tests();
    	choixville();
		ajoutermenu();
    	setVisible(true);
        this.addWindowListener(
            new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            }
        );
    }
    /*
     *affiche la page d'accueil
     */
    public void choixville(){
		setContentPane(new JPanel(){
			public void paintComponent(Graphics p){
        		Image img = new ImageIcon(getClass().getResource("france.jpg")).getImage();
        		p.drawImage(img,250,10,535,584,this);
    	 		g=(Graphics2D)p;
    			g.setFont(new Font("Arial",Font.ITALIC,14));
    			for(int i=0;i<textes.length;i++){
    				if(textes[i].menu == "choixville")
    					g.drawString(textes[i].texte,textes[i].x,textes[i].y);
    			}
    		}
    	});
    	affichervilles();
    }
    public void afficherTextes(String menu){
    	final String menuu=menu;
		setContentPane(new JPanel(){
			public void paintComponent(Graphics p){
        		g=(Graphics2D)p;
    			g.setFont(new Font("Arial",Font.ITALIC,14));
    			for(int i=0;i<textes.length;i++){
    				if(textes[i].menu == menuu)
    					g.drawString(textes[i].texte,textes[i].x,textes[i].y);
    			}
    		}
    	});
    }
	public void affichervilles(){
		try{
			bdd.connection();
			ResultSet rs = bdd.requete("select * from Ville");
			while(rs.next()){
				ajouterville(rs.getObject("nom").toString(),rs.getInt("x"),rs.getInt("y"));
			}
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
	public void afficherhotels(String ville){
		JPanel pane = new JPanel();
		GridLayout gl = new GridLayout(0,2);
		gl.setHgap(5);
		gl.setVgap(5);
		pane.setLayout(gl);
		/*JEditorPane jep = new JEditorPane();
		jep.setText("salut ma poule et \ntout et tout");
		jep.setEditorKit(null);
		pane.add(jep);*/
		//pane.add(new JLabel("<html>Grand Hotel de Paris<hr>Un charme exceptionnel<br>pour cet hotel de grand standing<br>avec vue sur la Tour Eiffel</html>"));
		//pane.add(new JLabel(new ImageIcon("images/hotelparis.jpg")));
		
		bdd.connection();
		try{
			//modifier la requète pour n'afficher que les hotels où il reste des chambres aux dates indiquées
			ResultSet rs = bdd.requete("select * from Hotel where ville='"+ville+"'");
			ResultSetMetaData metadata = rs.getMetaData();
			int cols = metadata.getColumnCount();
			while(rs.next()){
				final String nom = rs.getObject("nom").toString();
				String hotel = "<html>"+nom+" - Etoiles : ";
				for(int i=0;i<rs.getInt("etoiles");i++)
					hotel+="*";
				hotel+=("<br><font color=gray size=2>"+rs.getObject("adresse").toString()+"</font><hr>"
					+rs.getObject("commentaire").toString()+"</html>");
				JPanel texte = new JPanel();
				texte.add(new JLabel(hotel));
				pane.add(texte);
				JPanel pano = new JPanel();
				ImageIcon ii = new ImageIcon("images/"+rs.getObject("photo").toString());
				JButton photo = new JButton(ii);
				photo.setMargin(new Insets(0,0,0,0));
				final String ville2=ville;
				photo.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent e){
 			      		try{
 			      			reserverHotel(nom,ville2);
 			      		}catch(Exception ee){System.out.println(ee.toString());}
    	    		}
        		});
        		pano.add(photo);
				pane.add(pano);
			}
		}
		catch(Exception e){
			e.printStackTrace();
		}
		
		pane.setBounds(250,50,600,700);
		setContentPane(new JPanel());
        getContentPane().setLayout(null);
        JLabel jlb = new JLabel("Les hotels de la ville de "+ville);
        jlb.setBounds(200,10,300,30);
        getContentPane().add(jlb);
        getContentPane().add(pane);
		setVisible(true);
	}

	public void reserverHotel(String nomHotel,String nomVille){
		try{
		final JPanel pane = new JPanel();
		GridLayout gl = new GridLayout(0,2);
		gl.setHgap(5);
		gl.setVgap(5);
		pane.setLayout(gl);
		bdd.connection();
		ResultSet rs = bdd.requete("select * from Hotel where nom='"+nomHotel+"' and ville='"+nomVille+"'");
		rs.next();

		String hotel = "<html>"+nomHotel+" - Etoiles : ";
		for(int i=0;i<rs.getInt("etoiles");i++) hotel+="*";
		hotel+=("<br><font color=gray size=2>"+rs.getObject("adresse").toString()+"</font><hr>"
				+rs.getObject("commentaire").toString()+"<br><i>Plus d'info sur "+rs.getObject("site").toString()+"</i></html>");
		final JPanel texte = new JPanel();
		texte.add(new JLabel(hotel));
		pane.add(texte);
		
		ImageIcon ii = new ImageIcon("images/"+rs.getObject("photo").toString());
		JButton photo = new JButton(ii);
		photo.setMargin(new Insets(0,0,0,0));
		final JPanel pic = new JPanel();
		pic.add(photo);
		pane.add(pic);
		final JPanel formulaire = new JPanel();
		formulaire.setLayout(gl);
		JTextField nom = new JTextField(15);
		formulaire.add(new JLabel("<html><i>Si vous vous êtes déjà enregistré, n'entrez que votre nom et votre prénom</i><br>Pour effectuer cette réservation, veuillez entrer votre nom <br></html>"));
		formulaire.add(nom);
		JTextField prenom = new JTextField(15);
		formulaire.add(new JLabel("<html>Votre prénom <br></html>"));
		formulaire.add(prenom);
		JTextField mail = new JTextField(15);
		formulaire.add(new JLabel("<html>Votre mail <br></html>"));
		formulaire.add(mail);
		JTextField adresse = new JTextField(15);
		formulaire.add(new JLabel("<html>Votre adresse <i><font color=gray size=2>Important pour la réception de vos coupons de réservation</font></i><br></html>"));
		formulaire.add(adresse);
		JTextField commentaire = new JTextField(15);
		formulaire.add(new JLabel("<html>Donnez-nous plus de renseignements sur vous <br></html>"));
		formulaire.add(commentaire);
		JButton valider = new JButton("Valider");
		final JTextField mail2=mail,nom2=nom,prenom2=prenom,adresse2=adresse,commentaire2=commentaire;
		valider.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				if(numRows((bdd.requete("select * from Client where nom='"+nom2.getText()+"' and prenom='"+prenom2.getText()+"'")))==0){
					bdd.requeteInsert("insert into Client(nom,prenom,adresse,mail,commentaire) values('"+nom2.getText()
						+"','"+prenom2.getText()+"','"+mail2.getText()+"','"+adresse2.getText()
						+"','"+commentaire2.getText()+"')");
						System.out.println("Client bien enregistré");
				}
				else System.out.println("Client déjà enregistré");
				JPanel client = new JPanel();
				GridLayout gl = new GridLayout(0,1);
				gl.setHgap(5);
				gl.setVgap(5);
				client.setLayout(gl);
				JPanel p = new JPanel();
				p.add(texte);
				p.add(pic);
				client.add(p);
				bdd.requeteInsert("insert into ");
				client.add(new JLabel("<html><font color=red>Votre réservation est enregistrée au nom de : </font></html>",SwingConstants.CENTER));
				client.add(afficherClient(nom2.getText(),prenom2.getText()));
        		setContentPane(client);
        		setVisible(true);
			}
        });
        formulaire.add(valider);
		pane.add(formulaire);
		setContentPane(pane);
		setVisible(true);
		}
		catch(Exception e){
			System.out.println(e.toString());
		}
	}

	public JPanel afficherClient(String nom,String prenom){
		try{
		bdd.connection();
		ResultSet rs = bdd.requete("select * from Client where nom='"+nom+"' and prenom='"+prenom+"'");
		rs.next();
		JLabel jl = new JLabel("<html>Nom :<br>"+rs.getObject("nom").toString()
			+"<br>Prenom :<br>"+rs.getObject("prenom").toString()
			+"<br>Adresse :<br>"+rs.getObject("adresse").toString()
			+"<br>Mail :<br>"+rs.getObject("mail").toString()
			+"<br>Note :<br>"+rs.getObject("commentaire").toString()+"</html>");
		JPanel pane=new JPanel();
		pane.add(jl);
		return pane;
		}
		catch(Exception e){
			System.out.println(e.toString());
			return null;
		}
	}

	public int numRows (ResultSet rs){
		try{
		int i=0;
		while(rs.next()){
			i++;
		}
		return i;
		}
		catch(Exception e){
			System.out.println(e.toString());
			return -1;
		}
	}

    public void ajouterville(String nom, int x, int y){
    	getContentPane().setLayout(null);
    	final JButton ville = new JButton(nom);
		ville.setForeground(Color.red);
		ville.setFocusPainted(false);
		ville.setBorderPainted(false);
		ville.setContentAreaFilled(false);
		int taille = nom.length()*20;
		ville.setBounds(x,y,taille,25);
		ville.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				afficherhotels(ville.getAccessibleContext().getAccessibleName());
        	}
        });
        getContentPane().add(ville);
    }
	
	public JTable afficherRequete(String requete){
		bdd.connection();
		try{
			ResultSet rs = bdd.requete(requete);
			ResultSetMetaData metadata = rs.getMetaData();
			int cols = metadata.getColumnCount();
			String[] colonnes = new String[cols];
			for(int i = 1 ; i <= cols ; i++){
				colonnes[i-1]=metadata.getColumnName(i)+"("+metadata.getColumnTypeName(i)+")";
			}
			Object [][] data = new Object [2][cols];
			int ligne=0;
			while(rs.next()){
				for(int i = 1 ; i <= cols ; i++){
					if(rs.getObject(i)!=null)
						data[ligne][i-1] = (rs.getObject(i)).toString();
				}
				ligne++;
			}
			JTable table = new JTable(data, colonnes);
			return table;
		}
		catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
	public void tests(){
    	textes = new Texte[2];
    	textes[0] = new Texte("Pour effectuer une réservation",260,35,"choixville");;
    	textes[1] = new Texte("sélectionnez une ville sur la carte",260,55,"choixville");;
	}

	public void ajoutermenu(){
		MenuBar menuBar = new MenuBar();
        Menu menuExecuter = new Menu("Executer");
        Menu menuAide = new Menu("Aide");
	
		MenuItem menuExecuterAfficher = new MenuItem("Afficher");
        MenuItem menuExecuterChoixville = new MenuItem("Effectuer une réservation");
        MenuItem menuExecuterExit = new MenuItem("Quitter");
        MenuItem menuAideCredits = new MenuItem("Crédits");
        
        menuAideCredits.addActionListener(new ActionListener(){
        	public void actionPerformed(ActionEvent e){
        		JPanel pane = new JPanel();
        		pane.add(new JLabel("Fait par Juba et Adrien",SwingConstants.CENTER));
        		BddFrame.this.setContentPane(pane);
        		BddFrame.this.setVisible(true);
        	}
        });
        menuExecuterAfficher.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
            	BddFrame.this.repaint();
            	BddFrame.this.setContentPane(new JPanel(){
            		public void paintComponent(Graphics p){
    					g=(Graphics2D)p;
    					g.setColor(Color.BLACK);
    				}
    			});
        		BddFrame.this.setVisible(true);
            }
        }); 
        menuExecuterChoixville.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
            	BddFrame.this.repaint();
            	choixville();
        		BddFrame.this.setVisible(true);
            }
        }); 
        menuExecuterExit.addActionListener
        (
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.exit(0);
                }
            }
        ); 
        menuExecuter.add(menuExecuterChoixville);
        menuExecuter.add(menuExecuterAfficher);
        menuExecuter.add(menuExecuterExit);
        menuAide.add(menuAideCredits);
        menuBar.add(menuExecuter);
        menuBar.add(menuAide);
		setMenuBar(menuBar);
	}

	public static String date(){
		String s = "nous sommes le "+(new GregorianCalendar()).get(Calendar.DAY_OF_MONTH);
		s+="/"+((new GregorianCalendar()).get(Calendar.MONTH)+1);
		s+=("/"+(new GregorianCalendar()).get(Calendar.YEAR));
		return s;
	}
		
    public static void main(String [] args){
    	BddFrame programme = new BddFrame();
    }
			
}
 
class Texte{
	String texte;
	int x;
	int y;
	String menu;
	//constructeur pour les villes
	Texte(String s, int xx, int yy){
		texte = s;
		x=xx;
		y=yy;
	}
	Texte(String s, int xx, int yy, String menuu){
		texte = s;
		x=xx;
		y=yy;
		menu=menuu;
	}
}
