import crypto from 'crypto';

const createHash = (value) => {
    return crypto.createHash('sha256').update((typeof value === 'string' ? value : value.toString())).digest('hex');
}

function encryptData(data) {
    try {
        if (data === null || data === undefined) {
            data = '';
        }
        const cipher = crypto.createCipheriv(
            'aes-256-cbc',
            Buffer.from(process.env.ENCRYPTION_KEY, 'hex'),
            Buffer.alloc(16, 0)
        );
        let encrypted = cipher.update(data, 'utf8', 'hex');
        encrypted += cipher.final('hex');
        return encrypted;
    } catch (error) {
        return '';
    }
}
 
function decryptData(data) {
    if (!data || data === null || data === undefined || data === '') {
        return null;
    }
    
    // Prüfe, ob die Daten bereits entschlüsselt sind (nicht im Hex-Format)
    // Hex-Strings haben nur 0-9 und a-f Zeichen und gerade Länge
    const isHexString = /^[0-9a-fA-F]+$/.test(data) && data.length % 2 === 0;
    
    if (!isHexString) {
        // Daten sind wahrscheinlich bereits entschlüsselt oder in einem anderen Format
        // Versuche, sie direkt zurückzugeben
        return data;
    }
    
    try {
        const decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(process.env.ENCRYPTION_KEY, 'hex'), Buffer.alloc(16, 0));
        let decrypted = decipher.update(data, 'hex', 'utf8');
        decrypted += decipher.final('utf8');
        return decrypted;
    } catch (error) {
        // Wenn Entschlüsselung fehlschlägt, versuche die Daten direkt zurückzugeben
        // (falls sie bereits entschlüsselt sind)
        console.warn('[decryptData] Error decrypting data, returning as-is:', error.message);
        return data;
    }
}

export { createHash, encryptData, decryptData };