const { DataTypes } = require('sequelize');
const bcrypt = require('bcryptjs');

module.exports = (sequelize) => {
    const Utilisateur = sequelize.define('Utilisateur', {
        id: {
            type: DataTypes.INTEGER,
            primaryKey: true,
            autoIncrement: true
        },
        nom: {
            type: DataTypes.STRING(50),
            allowNull: false,
            comment: 'Nom de famille'
        },
        prenom: {
            type: DataTypes.STRING(50),
            allowNull: false,
            comment: 'Prénom'
        },
        email: {
            type: DataTypes.STRING(100),
            allowNull: false,
            unique: true,
            validate: {
                isEmail: true
            },
            comment: 'Adresse email (unique)'
        },
        mot_de_passe: {
            type: DataTypes.STRING(255),
            allowNull: false,
            comment: 'Mot de passe hashé'
        },
        telephone: {
            type: DataTypes.STRING(20),
            allowNull: true,
            comment: 'Numéro de téléphone'
        },
        role: {
            type: DataTypes.ENUM('admin', 'manager', 'serveur', 'cuisinier', 'caissier'),
            allowNull: false,
            defaultValue: 'serveur',
            comment: 'Rôle de l\'utilisateur'
        },
        statut: {
            type: DataTypes.ENUM('actif', 'inactif', 'suspendu'),
            allowNull: false,
            defaultValue: 'actif',
            comment: 'Statut du compte'
        },
        date_embauche: {
            type: DataTypes.DATE,
            allowNull: true,
            comment: 'Date d\'embauche'
        },
        salaire: {
            type: DataTypes.DECIMAL(10, 2),
            allowNull: true,
            comment: 'Salaire de base'
        },
        adresse: {
            type: DataTypes.TEXT,
            allowNull: true,
            comment: 'Adresse complète'
        },
        date_naissance: {
            type: DataTypes.DATE,
            allowNull: true,
            comment: 'Date de naissance'
        },
        photo: {
            type: DataTypes.STRING(255),
            allowNull: true,
            comment: 'Chemin vers la photo de profil'
        },
        derniere_connexion: {
            type: DataTypes.DATE,
            allowNull: true,
            comment: 'Date de dernière connexion'
        },
        token_reset: {
            type: DataTypes.STRING(255),
            allowNull: true,
            comment: 'Token pour réinitialisation mot de passe'
        },
        token_reset_expire: {
            type: DataTypes.DATE,
            allowNull: true,
            comment: 'Expiration du token de reset'
        },
        preferences: {
            type: DataTypes.JSON,
            allowNull: true,
            defaultValue: {},
            comment: 'Préférences utilisateur (JSON)'
        },
        est_actif: {
            type: DataTypes.BOOLEAN,
            allowNull: false,
            defaultValue: true,
            comment: 'Utilisateur actif ou non'
        }
    }, {
        tableName: 'utilisateurs',
        timestamps: true,
        createdAt: 'cree_le',
        updatedAt: 'modifie_le',
        hooks: {
            // Hash le mot de passe avant création
            beforeCreate: async (utilisateur) => {
                if (utilisateur.mot_de_passe) {
                    const salt = await bcrypt.genSalt(10);
                    utilisateur.mot_de_passe = await bcrypt.hash(utilisateur.mot_de_passe, salt);
                }
            },
            // Hash le mot de passe avant mise à jour
            beforeUpdate: async (utilisateur) => {
                if (utilisateur.changed('mot_de_passe')) {
                    const salt = await bcrypt.genSalt(10);
                    utilisateur.mot_de_passe = await bcrypt.hash(utilisateur.mot_de_passe, salt);
                }
            }
        }
    });

    // Méthode pour vérifier le mot de passe
    Utilisateur.prototype.verifierMotDePasse = async function(motDePasse) {
        return await bcrypt.compare(motDePasse, this.mot_de_passe);
    };

    // Méthode pour obtenir le nom complet
    Utilisateur.prototype.getNomComplet = function() {
        return `${this.prenom} ${this.nom}`;
    };

    // Méthode pour masquer les données sensibles
    Utilisateur.prototype.toSafeJSON = function() {
        const values = Object.assign({}, this.get());
        delete values.mot_de_passe;
        delete values.token_reset;
        return values;
    };

    return Utilisateur;
};
