//-----------------------------------------------------------------------------
// CorrTD123.java
// tourne le 24 fevrier 2020
// corrige TDs 1, 2 et 3
//-----------------------------------------------------------------------------

import java.io.*;
import java.sql.*;

class CorrTD123 {

    //-------------------------------------------------------------------------
    // adapte en utilisant les sequences du TD2a
    static void creerVillage(Connection c) 
	throws SQLException {
	String v = lireClavier("entrez ville : ");
	String a = lireClavier("entrez activite : ");
	int p = Integer.parseInt(lireClavier("entrez prix : "));
	int cap = Integer.parseInt(lireClavier("entrez capacite : "));
        String texte = 
	    "insert into village values(seq_village.nextval,'"
	    +v+"','"+a+"',"+p+","+cap+")";
        System.out.println(texte);
	Statement s = c.createStatement();
	s.executeUpdate(texte);
	s.close();
    }

    //-------------------------------------------------------------------------
    static void traitement3(Connection c) 
	throws SQLException {
	System.out.println("ici traitement3");

	// parametres :
	int jour = Integer.parseInt(lireClavier("entrez jour : "));

	// construction texte ordre :
        String texte = "delete sejour where jour<"+jour;
        System.out.println(texte);

	// acces serveur :
	Statement s = c.createStatement();
	int nb = s.executeUpdate(texte);
	s.close();

	// retours :
	System.out.println("Retour : nombre de sejours detruits : "+nb);
    }

    //-------------------------------------------------------------------------
    static Connection connexion(String login, String password, 
				String serveur, String base) 
	throws SQLException {
	System.out.println("ici connexion "+login);
	Connection c = DriverManager.getConnection(
            "jdbc:oracle:thin:"+login+"/"+password+"@"+serveur+":1522:"+base); 
	return c;
    }

    //-------------------------------------------------------------------------
    static void deconnexion(Connection c) 
	throws SQLException {
	System.out.println("ici deconnexion");
	c.close();
    }

    //-------------------------------------------------------------------------
    static void doubleConnexion(Connection c) 
	throws SQLException {
	System.out.println("ici doubleConnexion");

	int i = Integer.parseInt(lireClavier("entrez identifiant : "));
        String v = lireClavier("entrez ville : ");
        String a = lireClavier("entrez activite : ");
        int p = Integer.parseInt(lireClavier("entrez prix : "));
        int cap = Integer.parseInt(lireClavier("entrez capacite : "));
        String texte =
            "insert into village values("+i+",'"+v+"','"+a+"',"+p+","+cap+")";
        System.out.println(texte);

	Statement s = c.createStatement();
	s.executeUpdate(texte);
	s.close();

	c = connexion("c##ewaller2_a", "ewaller2_a", "tp-oracle", "dbinfo"); 
	s = c.createStatement();
	s.executeUpdate(texte);
	s.close();
    }

    //-------------------------------------------------------------------------
    static void authentification(Connection c) 
	throws SQLException {
	String ic = lireClavier("entrez identifiant client : ");
	String nom = lireClavier("entrez nom : ");
	String texte = "select * "
		      +"from client "
		      +"where idc = "+ic
                      +" and nom = '"+nom+"'";
	System.out.println(texte);

	Statement s = c.createStatement();
	ResultSet r = s.executeQuery(texte);
	if (r.next())
	    System.out.println(
                 "Bienvenue "+r.getString(2)+", age : "+r.getInt(3)+
		 ", avoir : "+r.getInt(4));
	else
	    System.out.println("desole, erreur identifiant/nom");
	r.close();
	s.close();
    }

    //-------------------------------------------------------------------------
    static String lireClavier(String message) {
	try {
	    System.out.print(message);
	    BufferedReader clavier =
		new BufferedReader(new InputStreamReader(System.in));
	    return clavier.readLine();
	} catch (Exception e) {
	    return "erreur dans fonction lireClavier";
	}
    }

    //-------------------------------------------------------------------------
    public static void main(String[] args) {
	//	throws SQLException, ClassNotFoundException {
	try {
	    Class.forName("oracle.jdbc.driver.OracleDriver"); 
	} catch(ClassNotFoundException e) {
	    e.printStackTrace();
	}	    
	try {
	    Connection c = connexion("c##ewaller_a", "ewaller_a", "tp-oracle",
				     "dbinfo"); 
	} catch(SQLException e) {
	    e.printStackTrace(); // e.getMessage();
	}
	while (true) {
	    System.out.println("-------------------------------");
	    System.out.println("Bienvenue dans le menu CorrJDBC");
	    System.out.println("0 : deconnexion");
	    System.out.println("1 : creer village (employe)");
	    System.out.println("2 : traitement 3 (employe)");
	    System.out.println("3 : double connexion");
	    System.out.println("4 : authentification");

	    System.out.println("3 : traitement 3 avec try-catch");
	    System.out.println("4 : consulter villages (employe)");
	    System.out.println("5 : traitement 1 (client)");
	    System.out.println("6 : consulter villages (client)");
	    System.out.println("7 : consulter villages sans sejours (client)");
	    System.out.println("8 : traitement 2 (client)");

	    System.out.println("-1 : terminer");
	    int n = Integer.parseInt(lireClavier("Entrez votre choix : "));
	    switch (n) {
		try {
		    case 0 : deconnexion(c); break;
		    case 1 : creerVillage(c); break;
		    case 2 : traitement3(c); break;
		    case 3 : doubleConnexion(c); break;
		    case 4 : authentification(c); break;
                    case 3 : traitement3TryCatch(c); break;
		    case 4 : consulterVillagesEmploye(c); break;
		    case 5 : traitement1(c); break;
		    case 6 : consulterVillagesClient(c); break;
		    case 8 : traitement2(c); break;
		    case -1 : return;
		} catch(SQLException e) {
		    e.printStackTrace(); // e.getMessage();
		}
	    }
	}
    }
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------

    //-------------------------------------------------------------------------
    static void traitement3TryCatch(Connection c) {
	System.out.println("ici traitement3TryCatch");
	int jour = Integer.parseInt(lireClavier("entrez jour : "));
        String texte = "delete sejour where jour<"+jour;
        System.out.println(texte);
	try {
	    Statement stmt = c.createStatement();
	    int nb = stmt.executeUpdate(texte);
	    stmt.close();
	    System.out.println("Retour : nombre de sejours detruits : "+nb);
	} catch (SQLException e) {
	    System.out.print("argl ! : ");
	    System.err.println(e);
	}
    }

    //-------------------------------------------------------------------------
    static void consulterVillagesEmploye(Connection c) 
	throws SQLException {
	System.out.println("ici consulterVillagesEmploye");
        String texte = "select * from village";
        System.out.println(texte);
	Statement stmt = c.createStatement();
	ResultSet r = stmt.executeQuery(texte);
	while (r.next())
	    System.out.println(r.getInt(1)+", "+r.getString(2)+", "
			       +r.getString(3)+", "+r.getInt(4)+", "
			       +r.getInt(5));
	r.close();
	stmt.close();
    }

    //-------------------------------------------------------------------------
    static void traitement1(Connection c) 
	throws SQLException {
	System.out.println("ici traitement1");

	// parametre(s) :
	String n = lireClavier("entrez nom : ");
	int a = Integer.parseInt(lireClavier("entrez age : "));

        String texte = "select seq_client.nextval from dual";
        System.out.println(texte);
	Statement s = c.createStatement();
	ResultSet r = s.executeQuery(texte);
	r.next();
	int ic = r.getInt(1); 
	r.close();
	// ideal serait un select into au lieu d'un curseur puisqu'il y a 
	// exactement une valeur de retour

        texte = 
	    "insert into client(idc,nom,age) values("+ic+",'"+n+"',"+a+")";
        System.out.println(texte);
	// acces serveur :
	Statement stmt = c.createStatement();
	stmt.executeUpdate(texte);
	stmt.close();

	// retour(s) :
	System.out.println("identifiant client : "+ic);
    }

    //-------------------------------------------------------------------------
    static void consulterVillagesClient(Connection c) 
	throws SQLException {
	System.out.println("ici consulterVillagesClient");
	int ic = Integer.parseInt(lireClavier("entrez identifiant client : "));
        String texte =
	    "select village.idv, ville, activite,prix, capacite\n"
	    +"from village, sejour\n"
	    +"where village.idv = sejour.idv and idc = "+ic;
        System.out.println(texte);
	Statement stmt = c.createStatement();
	ResultSet r = stmt.executeQuery(texte);
	while (r.next())
	    System.out.println(r.getInt(1)+", "+r.getString(2)+", "
			       +r.getString(3)+", "+r.getInt(4)+", "
			       +r.getInt(5));
	r.close();
	stmt.close();
    }

    //-------------------------------------------------------------------------
    static void traitement2(Connection c) 
	throws SQLException {
	System.out.println("ici traitement2");

	// parametres :
	int ic = Integer.parseInt(lireClavier("entrez identifiant client : "));
	String v = lireClavier("entrez ville : ");
	int j = Integer.parseInt(lireClavier("entrez jour : "));

	// initialisation valeurs retour pour cas ou pas de village :
	int iv=-1;
	int is=-1;
	String a="neant";

	int p;
	String texte = "select idv, activite, prix from village"
                       +" where ville = '"+v+"' order by prix desc";
	System.out.println(texte);

	Statement s = c.createStatement();
	ResultSet r = s.executeQuery(texte);
	if (r.next()) {
	    iv = r.getInt(1); // affectation valeur de retour 
	    a = r.getString(2); // affectation valeur de retour 
	    p = r.getInt(3); 
	    r.close();
	    
	    // achat sejour :
	    texte = "insert into sejour values(seq_sejour.nextval,"+ic+","
                    +iv+","+j+")";
	    System.out.println(texte);
	    s.executeUpdate(texte); 
	    texte = "update client set avoir=avoir-"+p+" where idc="+ic; 
	    System.out.println(texte);
	    s.executeUpdate(texte);
	    
	    // affectation valeur de retour :
	    texte = "select seq_sejour.currval from dual";
	    // ideal serait select into au lieu curseur, comme dans traitement1
	    r = s.executeQuery(texte);
	    r.next();
	    is = r.getInt(1); 
	    r.close();
	}
	
	// retours :	
	System.out.println("village "+iv+", sejour "+is+", activite "+a);
    }



//-----------------------------------------------------------------------------
