import crypto from "crypto";
import {secrets} from "./secrets"
const ALGORITHM = "aes-256-gcm";

function getEncryptionKey() {
    const key = secrets.ENCRYPTION_KEY || ""

    if (!/^[a-f0-9]{64}$/i.test(key)) {
        throw new Error("ENCRYPTION_KEY muss ein 64 Zeichen langer Hex-String sein. Beispiel: openssl rand -hex 32")
    }

    return Buffer.from(key, "hex")
}

export function encrypt(text) {
    const ENCRYPTION_KEY = getEncryptionKey();
    const iv = crypto.randomBytes(16);
    const cipher = crypto.createCipheriv(ALGORITHM, ENCRYPTION_KEY, iv);

    const encrypted = Buffer.concat([cipher.update(text, "utf8"), cipher.final()]);
    const tag = cipher.getAuthTag();

    return {
        iv: iv.toString("hex"),
        content: encrypted.toString("hex"),
        tag: tag.toString("hex"),
    };
}

export function decrypt({ iv, content, tag }) {
    const ENCRYPTION_KEY = getEncryptionKey();
    const decipher = crypto.createDecipheriv(
        ALGORITHM,
        ENCRYPTION_KEY,
        Buffer.from(iv, "hex")
    );
    decipher.setAuthTag(Buffer.from(tag, "hex"));

    const decrypted = Buffer.concat([
        decipher.update(Buffer.from(content, "hex")),
        decipher.final(),
    ]);

    return decrypted.toString("utf8");
}
