import crypto from 'crypto'

// Verschlüsselungskonfiguration
const ALGORITHM = 'aes-256-cbc'
const IV_LENGTH = 16
const SALT_LENGTH = 32

/**
 * Generiert einen Schlüssel aus einem Passwort und Salt
 */
function deriveKey(password, salt) {
  return crypto.pbkdf2Sync(password, salt, 100000, 32, 'sha512')
}

/**
 * Verschlüsselt einen Text
 */
export function encrypt(text, password) {
  try {
    // Salt generieren
    const salt = crypto.randomBytes(SALT_LENGTH)
    
    // Schlüssel ableiten
    const key = deriveKey(password, salt)
    
    // IV generieren
    const iv = crypto.randomBytes(IV_LENGTH)
    
    // Cipher erstellen
    const cipher = crypto.createCipheriv(ALGORITHM, key, iv)
    
    // Verschlüsseln
    let encrypted = cipher.update(text, 'utf8', 'hex')
    encrypted += cipher.final('hex')
    
    // Salt + IV + Verschlüsselter Text kombinieren
    const combined = Buffer.concat([
      salt,
      iv,
      Buffer.from(encrypted, 'hex')
    ])
    
    return combined.toString('base64')
  } catch (error) {
    console.error('Verschlüsselungsfehler:', error)
    throw new Error('Fehler beim Verschlüsseln der Daten')
  }
}

/**
 * Entschlüsselt einen Text
 */
export function decrypt(encryptedData, password) {
  try {
    // Base64 dekodieren
    const combined = Buffer.from(encryptedData, 'base64')
    
    // Komponenten extrahieren
    const salt = combined.subarray(0, SALT_LENGTH)
    const iv = combined.subarray(SALT_LENGTH, SALT_LENGTH + IV_LENGTH)
    const encrypted = combined.subarray(SALT_LENGTH + IV_LENGTH)
    
    // Schlüssel ableiten
    const key = deriveKey(password, salt)
    
    // Decipher erstellen
    const decipher = crypto.createDecipheriv(ALGORITHM, key, iv)
    
    // Entschlüsseln
    let decrypted = decipher.update(encrypted, null, 'utf8')
    decrypted += decipher.final('utf8')
    
    return decrypted
  } catch (error) {
    console.error('Entschlüsselungsfehler:', error)
    throw new Error('Fehler beim Entschlüsseln der Daten')
  }
}

/**
 * Verschlüsselt ein Objekt (konvertiert zu JSON)
 */
export function encryptObject(obj, password) {
  const jsonString = JSON.stringify(obj)
  return encrypt(jsonString, password)
}

/**
 * Entschlüsselt ein Objekt (konvertiert von JSON)
 */
export function decryptObject(encryptedData, password) {
  const jsonString = decrypt(encryptedData, password)
  return JSON.parse(jsonString)
}

/**
 * Generiert einen sicheren Schlüssel für die Datenverschlüsselung
 */
export function generateEncryptionKey() {
  return crypto.randomBytes(32).toString('hex')
}

