<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Carbon;

/**
 * @property int $ID_Utilisateur
 * @property string $Email
 * @property string $MotDePasse
 * @property string $Pseudo
 * @property string $Statut
 * @property int $ID_Role
 * @property Carbon $DateInscription
 */
class Utilisateur extends Authenticatable
{
    use Notifiable;

    // Nom de la table
    protected $table = 'utilisateurs';

    // La table utilise DateInscription et non created_at/updated_at
    public $timestamps = false;

    // Clé primaire personnalisée
    protected $primaryKey = 'ID_Utilisateur';

    public $incrementing = true;

    protected $keyType = 'int';

    // Colonnes modifiables (Mass Assignment)
    protected $fillable = [
        'Email',
        'MotDePasse',
        'Pseudo',
        'Statut',
        'ID_Role',
        'DateInscription',
    ];

    // Données sensibles à cacher
    protected $hidden = [
        'MotDePasse',
    ];

    // Casts des attributs
    protected $casts = [
        'MotDePasse' => 'hashed',
        'DateInscription' => 'datetime',
    ];

    // Utiliser Email comme authentifiant
    public function getAuthIdentifierName()
    {
        return 'Email';
    }

    // Utiliser MotDePasse comme mot de passe
    public function getAuthPassword()
    {
        return $this->MotDePasse;
    }

    // Relation avec Role
    public function role()
    {
        return $this->belongsTo(Role::class, 'ID_Role', 'ID_Role');
    }

    // Relation avec Ressources créées
    public function ressourcesCreees()
    {
        return $this->hasMany(Ressource::class, 'ID_Utilisateur_Createur', 'ID_Utilisateur');
    }

    // Relation avec Commentaires
    public function commentaires()
    {
        return $this->hasMany(Commentaire::class, 'ID_Utilisateur', 'ID_Utilisateur');
    }

    // Relation avec Activites hôtées
    public function activitesHotees()
    {
        return $this->hasMany(Activite::class, 'ID_Utilisateur_Hote', 'ID_Utilisateur');
    }

    // Relation avec Progressions
    public function progressions()
    {
        return $this->hasMany(Utilisateur_Progression::class, 'ID_Utilisateur', 'ID_Utilisateur');
    }

    /**
     * Anonymise le compte (droit à l'effacement RGPD).
     *
     * Les données personnelles identifiantes (e-mail, pseudo, mot de passe)
     * sont remplacées par des valeurs neutres et non réversibles, tandis que
     * les contributions liées (ressources, commentaires) restent en base sous
     * une forme anonyme afin de préserver l'intégrité référentielle.
     */
    public function anonymiser(): void
    {
        $this->Email = 'anonyme_'.$this->ID_Utilisateur.'@anonymise.local';
        $this->Pseudo = 'Utilisateur supprimé';
        $this->MotDePasse = bin2hex(random_bytes(32)); // mot de passe non utilisable
        $this->Statut = 'Inactif'; // compte désactivé (valeur de l'enum Statut)
        $this->save();
    }
}
