
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 ein neues Zertifikat
    const cert = forge.pki.createCertificate();
    cert.publicKey = keys.publicKey;
    // cert.serialNumber = '01';
    cert.validity.notBefore = new Date();
    cert.validity.notAfter = new Date();
    cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 10);

    const attrs = [{
        name: 'commonName',
        value: 'My Root CA'
    }, {
        name: 'countryName',
        value: 'US'
    }, {
        shortName: 'ST',
        value: 'California'
    }, {
        name: 'localityName',
        value: 'San Francisco'
    }, {
        name: 'organizationName',
        value: 'My Organization'
    }, {
        shortName: 'OU',
        value: 'My Organizational Unit'
    }];

    cert.setSubject(attrs);
    cert.setIssuer(attrs);

    // Erweiterungen hinzufügen
    cert.setExtensions([{
        name: 'basicConstraints',
        cA: true
    }, {
        name: 'keyUsage',
        keyCertSign: true,
        cRLSign: true
    }, {
        name: 'subjectKeyIdentifier'
    }]);

    // Zertifikat mit dem privaten Schlüssel signieren
    cert.sign(keys.privateKey, forge.md.sha256.create());

    // Zertifikat und Schlüssel als PEM kodieren
    const pemCert = forge.pki.certificateToPem(cert);
    const pemPrivateKey = forge.pki.privateKeyToPem(keys.privateKey);
    const pemPublicKey = forge.pki.publicKeyToPem(keys.publicKey);

    // 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();