package fr.iutfbleau.papillon;

import java.sql.*;

/**
 * La classe <code>UtilisateurBD</code> gère la table <b>utilisateur</b>
 * de la base de données.  
 * <p>Elle permet de créer ou de récupérer un utilisateur à partir d’une clé locale,
 * et de lire un utilisateur complet via sa clé.</p>
 *
 * @version 1.0
 * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL
 */
public class UtilisateurBD {

    /** Identifiant interne de l’utilisateur. */
    private static int id;

    /**
     * Récupère ou crée un utilisateur en fonction de sa clé unique.
     *
     * @param cle la clé unique associée à l’utilisateur
     * @return l’identifiant de l’utilisateur correspondant
     * @throws SQLException si une erreur SQL survient
     */
    public static int getOrCreateIdByKey(String cle) throws SQLException {
        Connection cnx = BaseDeDonnees.getConnexion();

        // Vérifie si un utilisateur existe déjà avec cette clé
        String sqlSelect = "SELECT id FROM utilisateur WHERE cle = ?";
        PreparedStatement pstSelect = cnx.prepareStatement(sqlSelect);
        pstSelect.setString(1, cle);
        ResultSet rs = pstSelect.executeQuery();

        if (rs.next()) {
            id = rs.getInt("id");
        } else {
            // Sinon on en crée un nouveau
            String sqlInsert = "INSERT INTO utilisateur (cle) VALUES (?)";
            PreparedStatement pstInsert = cnx.prepareStatement(sqlInsert, Statement.RETURN_GENERATED_KEYS);
            pstInsert.setString(1, cle);
            pstInsert.executeUpdate();

            ResultSet keys = pstInsert.getGeneratedKeys();
            if (keys.next()) {
                id = keys.getInt(1);
            }

            keys.close();
            pstInsert.close();
        }

        rs.close();
        pstSelect.close();
        cnx.close();

        return id;
    }

    /**
     * Récupère un utilisateur complet à partir de sa clé.
     *
     * @param cle la clé unique de l’utilisateur
     * @return un objet {@link Utilisateur} si trouvé, sinon <code>null</code>
     * @throws SQLException si une erreur SQL survient
     */
    public static Utilisateur findByKey(String cle) throws SQLException {
        Connection cnx = BaseDeDonnees.getConnexion();
        String sql = "SELECT id, cle FROM utilisateur WHERE cle = ?";
        PreparedStatement pst = cnx.prepareStatement(sql);
        pst.setString(1, cle);
        ResultSet rs = pst.executeQuery();

        Utilisateur u = null;
        if (rs.next()) {
            u = new Utilisateur(rs.getInt("id"), rs.getString("cle"));
        }

        rs.close();
        pst.close();
        cnx.close();
        return u;
    }
}
