/*******************************************************************************
 * Copyright (c) 2025, Jan Koester jan.koester@gmx.net
 * All rights reserved.
 * * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * Neither the name of the <organization> nor the
 * names of its contributors may be used to endorse or promote products
 * derived from this software without specific prior written permission.
 * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *******************************************************************************/

#include <iostream>
#include <vector>
#include "crypto/x509.h"

int main(int argc, char *argv[]) {
    netplus::x509cert cert;

    if (argc < 2) {
        std::cerr << "Usage: " << argv[0] << " <cert.der>" << std::endl;
        return 1;
    }

    if (!cert.loadFromFile(argv[1])) {
        std::cerr << "Error: Could not load or parse the DER file." << std::endl;
        return 1;
    }

    std::cout << "--- Certificate Status ---" << std::endl;
    cert.checkValidity();

    netplus::rsa rsaEngine;
    if (cert.extractPublicKey(rsaEngine)) {
        std::cout << "Successfully extracted RSA Public Key." << std::endl;
    } else {
        std::cerr << "Failed to extract RSA Public Key components." << std::endl;
    }

    std::cout << "\n--- Certificate Identity ---" << std::endl;

    std::vector<std::string> domains = cert.getSubjectAltNames();
    if (domains.empty()) {
        std::cout << "Subject (CN): " << cert.getSubjectCN() << std::endl;
    } else {
        std::cout << "Authorized Domains (SAN):" << std::endl;
        for (const auto& domain : domains) {
            std::cout << "  - " << domain << std::endl;
        }
    }

    std::cout << "\n--- RSA Engine Test ---" << std::endl;

    // FIX: Initialize bigInt using the new binary-friendly method
    netplus::rsa::bigInt message(static_cast<size_t>(8));
    message.fromUint64(42);

    netplus::rsa::bigInt ciphertext = rsaEngine.encrypt(message);

    std::cout << "Test encryption of '42' complete." << std::endl;

    // FIX: Use toHexString() instead of toString()
    std::string hexCipher = ciphertext.toHexString();
    std::cout << "Ciphertext: " << (hexCipher.length() > 32 ? hexCipher.substr(0, 32) : hexCipher) << "..." << std::endl;

    return 0;
}
