package fr.iutfbleau.papillon;

import java.io.*;
import java.util.UUID;

/**
 * La classe <code>UserKey</code> permet de gérer une clé d'identification locale
 * unique pour un utilisateur du logiciel <b>Papillon</b>.
 *
 * <p>
 * Cette clé est stockée dans un fichier caché nommé <code>.papillon_id</code>
 * dans le répertoire personnel de l'utilisateur.  
 * Elle sert à identifier l'utilisateur sans avoir besoin de système de connexion
 * ou d'authentification centralisée.
 * </p>
 *
 * <p>
 * Lors du premier lancement du programme, si le fichier n’existe pas ou est vide,
 * une clé unique (UUID) est automatiquement générée, enregistrée dans ce fichier
 * et réutilisée pour les prochaines exécutions.
 * </p>
 *
 * @version 1.0
 * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL
 */
public class UserKey {

    /**
     * Lit la clé stockée dans le fichier <code>~/.papillon_id</code>
     * ou en génère une nouvelle si le fichier n'existe pas ou est vide.
     *
     * <p>Cette méthode est utilisée par {@link GestionRappel} pour associer
     * chaque utilisateur à ses données locales.</p>
     *
     * @return une chaîne de caractères représentant la clé unique de l'utilisateur
     */
    protected static String lireOuCreerCle() {
        // Récupère le dossier personnel de l’utilisateur
        String home = System.getProperty("user.home");
        File fichier = new File(home, ".papillon_id");
        String cle = "";

        try {
            // Si le fichier existe déjà on lit son contenu
            if (fichier.exists()) {
                if (fichier.length() == 0) {
                    cle = genererCle(); // Génère une clé unique
                    ecrireCle(fichier, cle);
                    System.out.println("Le fichier de clé est vide. Génération d'une nouvelle clé.");
                }

                FileReader fr = new FileReader(fichier);
                BufferedReader br = new BufferedReader(fr);
                cle = br.readLine();  // lit la première ligne (la clé)
                br.close();
                fr.close();

                System.out.println("Clé existante trouvée : " + cle);
            }
            // Sinon, on génère une nouvelle clé et on l’écrit dans le fichier
            else {
                cle = genererCle();
                ecrireCle(fichier, cle);
                System.out.println("Nouvelle clé générée et enregistrée : " + cle);
            }

        } catch (IOException e) {
            System.err.println("Erreur lors de la lecture/écriture du fichier de clé : " + e.getMessage());
        }

        return cle;
    }

    /**
     * Génère une nouvelle clé unique sous la forme d'un identifiant universel (UUID).
     *
     * <p>Cette méthode utilise la classe {@link java.util.UUID} pour générer
     * une chaîne aléatoire unique et pratiquement impossible à deviner.</p>
     *
     * @return une chaîne aléatoire unique représentant une clé utilisateur
     */
    private static String genererCle() {
        return UUID.randomUUID().toString();
    }

    /**
     * Écrit une clé donnée dans un fichier texte.
     *
     * <p>Cette méthode crée le fichier s’il n’existe pas, puis enregistre
     * la clé passée en paramètre sur la première ligne du fichier.</p>
     *
     * @param fichier le fichier dans lequel écrire la clé
     * @param cle la clé à sauvegarder dans le fichier
     * @throws IOException si une erreur survient lors de l’écriture
     */
    private static void ecrireCle(File fichier, String cle) throws IOException {
        FileWriter fw = new FileWriter(fichier);
        BufferedWriter bw = new BufferedWriter(fw);
        bw.write(cle);
        bw.newLine();
        bw.close();
        fw.close();
    }
}
