package javacodebook.server.login;

import java.sql.*;

/**
 *  Die Klasse User kapselt die Benutzerdaten und die Abfrage der Login-Daten
 *  aus einer Datenbank. Ein Benutzer hat die Daten ID, Login-Name, Name,
 *  Passwort und Email. Das Passwort kann von aussen nicht ermittelt werden, um
 *  keine Sicherheitslücke zu erzeugen.
 */
public class User {

    private String id;
    private String loginName;
    private String name;
    private String email;

    //der Konstruktor für User ist privat, da die Klasse selbst kontrolliert,
    //wie der Zugriff auf die Benutzertabelle erfolgt.
    private User(String id, String loginName, String name, String email) {
        this.id = id;
        this.loginName = loginName;
        this.name = name;
        this.email = email;
    }

    //Hier wird anhand des Login-Namens und des Passworts nach einem
    //entsprechenden Benutzer gesucht. Wird keiner gefunden, so wird null
    //zrückgegeben. Login-Namen müssen eindeutig sein, daher kann kein
    //mehrfaches Ergebnis gefunden werden.
    public static User findUser(String loginName, String passwd) {
        User user = null;
        Connection conn = null;
        PreparedStatement stmt = null;
        try {
            //JDBC-Treiber laden
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection(
            "jdbc:oracle:thin:@127.0.0.1:1521:dirk", "book", "book");

            //Abfrage von Login und Passwort in der Datenbank
            String sql = "select * from user_table where user_login = ? "
                       + " and user_passwd = ?";
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, loginName);
            stmt.setString(2, passwd);
            ResultSet rs = stmt.executeQuery();
            if (rs.next()) {
                user = new User(rs.getString("user_id"),
                rs.getString("user_login"),
                rs.getString("user_name"),
                rs.getString("user_email"));
            }
            rs.close();
        } catch(Exception e) {
            e.printStackTrace(System.out);
        } finally {
            //Connection und  PreparedStatement müss auf jeden Fall geschlossen
            //werden, um belegte Ressourcen wieder freizugeben.
            try { stmt.close(); } catch(Exception ignored) {}
            try { conn.close(); } catch(Exception ignored) {}
        }
        return user;
    }

    public String getId() {
        return id;
    }

    public String getLoginName() {
        return loginName;
    }

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }
}
