package fr.iutfbleau.papillon;

import java.sql.SQLException;
import java.util.List;

/**
 * La classe <code>GestionRappel</code> gère les opérations CRUD
 * (création, lecture, modification, suppression) sur les rappels
 * associés à l’utilisateur courant.
 * <p>
 * Elle s’appuie sur les classes <code>Rappel</code>, <code>RappelBD</code>,
 * <code>UserKey</code> et <code>UtilisateurBD</code> pour interagir
 * avec la base de données.
 * </p>
 *
 * @version 1.0
 * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL
 */
public class GestionRappel {

    /** Identifiant de l'utilisateur courant. */
    private final int utilisateurId;

    /**
     * Constructeur de la classe <code>GestionRappel</code>.
     * <p>
     * Initialise l’identifiant utilisateur en se basant sur la clé locale.
     * Si aucun utilisateur n’existe encore, il est automatiquement créé
     * dans la base de données.
     * </p>
     */
    public GestionRappel() {
        int uid = -1;
        try {
            String cle = UserKey.lireOuCreerCle();  // clé locale
            uid = UtilisateurBD.getOrCreateIdByKey(cle); // crée ou récupère utilisateur
        } catch (Exception e) {
            e.printStackTrace();
        }
        this.utilisateurId = uid;
        System.out.println("Utilisateur courant id=" + this.utilisateurId);
    }

    /**
     * Ajoute un nouveau rappel pour l’utilisateur courant.
     *
     * @param titre le titre du rappel
     * @param contenu le contenu textuel du rappel
     * @param theme le thème associé au rappel
     * @param rang la priorité du rappel
     * @return le nombre de lignes affectées ou l’ID du rappel ajouté
     * @throws SQLException si une erreur survient lors de l’ajout
     */
    public int ajouter(String titre, String contenu, String theme, int rang) throws SQLException {
        Rappel r = new Rappel(titre, contenu, theme, rang);
        return RappelBD.ajouter(r, this.utilisateurId);
    }

    /**
     * Liste tous les rappels appartenant à l’utilisateur courant.
     *
     * @return la liste des rappels de l’utilisateur
     * @throws SQLException si une erreur de communication avec la base survient
     */
    public List<Rappel> lister() throws SQLException {
        return RappelBD.listerParUtilisateur(this.utilisateurId);
    }

    /**
     * Modifie un rappel existant à partir de son identifiant.
     *
     * @param id l’identifiant du rappel à modifier
     * @param r l’objet <code>Rappel</code> contenant les nouvelles valeurs
     * @return le nombre de lignes modifiées
     * @throws SQLException si une erreur survient lors de la mise à jour
     */
    public int modifierParId(int id, Rappel r) throws SQLException {
        return RappelBD.modifier(id, r, this.utilisateurId);
    }

    /**
     * Supprime un rappel de la base de données selon son identifiant.
     *
     * @param id l’identifiant du rappel à supprimer
     * @return le nombre de lignes supprimées
     * @throws SQLException si une erreur survient lors de la suppression
     */
    public int supprimerParId(int id) throws SQLException {
        return RappelBD.supprimer(id, this.utilisateurId);
    }

    /**
     * Supprime tous les rappels appartenant à l’utilisateur courant.
     *
     * @return le nombre de rappels supprimés
     * @throws SQLException si une erreur survient lors de la suppression
     */
    public int viderTousMesRappels() throws SQLException {
        return RappelBD.supprimerToutPourUtilisateur(this.utilisateurId);
    }

    /**
     * Renvoie l’identifiant de l’utilisateur courant.
     *
     * @return l’ID utilisateur
     */
    public int getUtilisateurId() {
        return this.utilisateurId;
    }
}
