
import {
    default as forge
} from "node-forge";

import {
    writeFileSync,
    mkdirSync
} from "fs";

import {
    randomBytes
} from "crypto";

// Funktion zur Generierung und Speicherung eines Root-CA-Zertifikats
export function generateRootCA(Params) {
    const uid = randomBytes(4).toString("hex");

    // Generiere ein neues Schlüsselpaar
    const keys = forge.pki.rsa.generateKeyPair(4096);

    // Erstelle einen neuen CSR
    const csr = forge.pki.createCertificationRequest();

    // Setze den öffentlichen Schlüssel
    csr.publicKey = keys.publicKey;

    // Setze die CSR Attribute
    csr.setSubject([{
        name: 'commonName',
        value: 'example.com'
    }, {
        name: 'countryName',
        value: 'US'
    }, {
        shortName: 'ST',
        value: 'California'
    }, {
        name: 'localityName',
        value: 'San Francisco'
    }, {
        name: 'organizationName',
        value: 'Example, Inc.'
    }, {
        shortName: 'OU',
        value: 'IT'
    }]);

    // Signiere die CSR mit dem privaten Schlüssel
    csr.sign(keys.privateKey, forge.md.sha256.create());

    // Überprüfe die CSR
    const verified = csr.verify();
    if (verified) {
        console.log('CSR verification successful');
    } else {
        console.error('CSR verification failed');
        return;
    }

    // CSR und Schlüssel als PEM kodieren
    const pemCsr = forge.pki.certificationRequestToPem(csr);
    const pemPrivateKey = forge.pki.privateKeyToPem(keys.privateKey);

    // Erstelle das RootCA Verzeichnis
    mkdirSync(`datastore/certificates/${uid}`)

    // Zertifikat und Schlüssel in Dateien speichern
    writeFileSync(`datastore/certificates/${uid}/rootCA.crt`, pemCert);
    writeFileSync(`datastore/certificates/${uid}/rootCA.key`, pemPrivateKey);
    writeFileSync(`datastore/certificates/${uid}/rootCA.pub`, pemPublicKey);

    console.log('Root CA-Zertifikat und Schlüssel wurden generiert und gespeichert.');
}

// Funktion aufrufen, um das Root-CA-Zertifikat zu generieren
// generateRootCA();