import { sequelize } from '../../utils/sequelize.js';
import { DataTypes } from 'sequelize';
import { encrypt, decrypt } from '../../utils/encryption.js';
import crypto from 'crypto';

const User = sequelize.define('user', {
    email: {
        type: DataTypes.BLOB,
        allowNull: false,
        unique: true,
        set(value) {
            if (value) {
                const encrypted = encrypt(value);
                // Konvertiere Hex-String zu Buffer für die Speicherung
                const buffer = Buffer.from(encrypted, 'hex');
                this.setDataValue('email', buffer);
            }
        },
        get() {
            const encrypted = this.getDataValue('email');
            if (encrypted) {
                try {
                    // Konvertiere Buffer zu String für die Entschlüsselung
                    const encryptedString = encrypted.toString('hex');
                    const decrypted = decrypt(encryptedString);
                    if (decrypted) {
                        return decrypted;
                    }
                } catch (error) {
                    console.warn('Email decryption failed, treating as plain text:', error.message);
                }
                
                // Fallback: Versuche es als Klartext zu lesen
                try {
                    return encrypted.toString('utf8');
                } catch (error) {
                    console.warn('Email could not be read as plain text:', error.message);
                    return null;
                }
            }
            return null;
        }
    },
    salt: {
        type: DataTypes.STRING,
        allowNull: false,
        defaultValue: () => crypto.randomBytes(16).toString('hex') 
    },
    username: {
        type: DataTypes.STRING,
        allowNull: false,
        unique: true
    },
    password: {
        type: DataTypes.STRING,
        allowNull: false,
    },
    registrationDate: {
        type: DataTypes.DATE,
        allowNull: false,
        defaultValue: DataTypes.NOW
    },
    active: {
        type: DataTypes.BOOLEAN,
        defaultValue: false
    },
    resetToken: {
        type: DataTypes.UUID,
        allowNull: true
    },
    hashedId: {
        type: DataTypes.STRING,
        allowNull: true
    },
    searchable: {
        type: DataTypes.BOOLEAN,
        defaultValue: true
    },
    authCode: {
        type: DataTypes.STRING,
        allowNull: true
    }
}, {
    tableName: 'user',
    schema: 'community',
    underscored: true,
    hooks: {
        afterCreate: async (user, options) => {
            const hashedId = crypto.createHash('sha256').update(user.id.toString()).digest('hex');
            user.hashedId = hashedId;
            await user.save();
        },
    }
});

export default User;
