// src/encriptarTodasFacturas.ts
import { FileEncryptionUseCase } from './FileEncryptionUseCase';
import * as fs from 'fs';
import * as path from 'path';
import { Readable } from 'stream';

async function encryptPdfInvoice(filePath: string, targetDir: string, pemFilePath: string): Promise<void> {
    try {
        const fileBuffer = fs.readFileSync(filePath);
        const originalname = path.basename(filePath);
        
        // Crear un objeto que simula Express.Multer.File
        const mockFile = {
            fieldname: 'file',
            originalname: originalname,
            encoding: '7bit',
            mimetype: 'application/pdf',
            size: fileBuffer.length,
            buffer: fileBuffer,
            destination: '',
            filename: '',
            path: '',
            stream: Readable.from(fileBuffer) // Añadir la propiedad stream requerida
        };
        
        // Modificar la clase FileEncryptionUseCase para usar el pemFilePath proporcionado
        const encryptionUseCase = new FileEncryptionUseCase(pemFilePath);
        const encryptedFilePath = await encryptionUseCase.execute(mockFile, targetDir);
        
        console.log(`✅ Archivo encriptado y clave generada para: ${originalname}`);
        console.log(`   - Archivo encriptado: ${encryptedFilePath}`);
        console.log(`   - Clave encriptada: ${encryptedFilePath.replace('.enc', '.key')}`);
    } catch (error) {
        console.error(`❌ Error durante la encriptación de ${path.basename(filePath)}:`, error);
    }
}

async function encryptAllInvoices(sourceDir: string, targetDir: string, pemFilePath: string): Promise<void> {
    // Asegúrate de que el directorio de destino exista
    if (!fs.existsSync(targetDir)) {
        fs.mkdirSync(targetDir, { recursive: true });
    }
    
    // Verifica si la carpeta de origen existe
    if (!fs.existsSync(sourceDir)) {
        console.error(`❌ La carpeta ${sourceDir} no existe.`);
        return;
    }
    
    // Lee todos los archivos en la carpeta de origen
    const files = fs.readdirSync(sourceDir);
    
    // Filtra solo los archivos PDF
    const pdfFiles = files.filter(file => file.toLowerCase().endsWith('.pdf'));
    
    if (pdfFiles.length === 0) {
        console.log('No se encontraron archivos PDF en la carpeta de facturas.');
        return;
    }
    
    console.log(`Encontrados ${pdfFiles.length} archivos PDF para encriptar.`);
    
    // Encripta cada archivo PDF
    for (const pdfFile of pdfFiles) {
        const filePath = path.join(sourceDir, pdfFile);
        console.log(`Procesando: ${pdfFile}`);
        await encryptPdfInvoice(filePath, targetDir, pemFilePath);
    }
    
    console.log('\n✅ Proceso de encriptación completado.');
    console.log(`Se han encriptado ${pdfFiles.length} facturas.`);
    console.log(`Los archivos encriptados y sus claves se encuentran en la carpeta ${targetDir}`);
}

// Obtener argumentos de la línea de comandos
const sourceDir = process.argv[2] || './facturas';
const targetDir = process.argv[3] || './tmp';
const pemFilePath = process.argv[4] || './secrets/rsa_public.pem';

// Ejecuta la función principal
encryptAllInvoices(sourceDir, targetDir, pemFilePath).catch(error => {
    console.error('❌ Error en el proceso de encriptación:', error);
});