// src/encryptInvoice.ts
import { FileEncryptionUseCase } from './FileEncryptionUseCase'; // Importa la clase de caso de uso de encriptación de archivos
import * as fs from 'fs';     // Importa el módulo fs para operaciones del sistema de archivos
import * as path from 'path'; // Importa el módulo path para trabajar con rutas de archivos y directorios
import { Readable } from 'stream';

async function encryptPdfInvoice(filePath: string) {
  try {
    const fileBuffer = fs.readFileSync(filePath); // Lee el contenido del archivo en un buffer
    const originalname = path.basename(filePath); // Obtiene el nombre base del archivo

    // Simular el objeto Express.Multer.File
    // El método 'execute' en FileEncryptionUseCase espera un objeto con esta estructura,
    // que es típica de archivos subidos a través de bibliotecas como Multer en Express.
    // Definir una interfaz para simular el objeto Multer.File
    interface MulterFile {
      fieldname: string;
      originalname: string;
      encoding: string;
      mimetype: string;
      size: number;
      buffer: Buffer;
      destination: string;
      filename: string;
      path: string;
      stream: Readable; // Añadir la propiedad stream requerida
    }
    
    // Y luego usar esta interfaz en lugar de Express.Multer.File
    const mockFile: MulterFile = {
        fieldname: 'file',
        originalname: originalname,
        encoding: '7bit',
        mimetype: 'application/pdf',
        size: fileBuffer.length,
        buffer: fileBuffer,
        destination: '',
        filename: '',
        path: '',
        stream: Readable.from(fileBuffer) // Corregir para usar fileBuffer
    };

    const encryptionUseCase = new FileEncryptionUseCase(); // Crea una instancia de la clase de caso de uso
    const encryptedFilePath = await encryptionUseCase.execute(mockFile); // Ejecuta la encriptación

    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:', error);
  }
}

// Ejemplo de uso:
// Define la ruta a tu archivo PDF de factura.
// Para probar, puedes crear un archivo PDF ficticio.
const invoicePdfPath = './facturas/mi_factura_20250607.pdf'; // Cambia esta ruta a tu PDF real.

// Crea un directorio para las facturas si no existe
if (!fs.existsSync('./facturas')) {
  fs.mkdirSync('./facturas');
}
// Crea un PDF ficticio si no existe para propósitos de prueba
if (!fs.existsSync(invoicePdfPath)) {
  // Contenido mínimo de un PDF para un archivo de prueba.
  // En un escenario real, aquí leerías tu archivo PDF de factura.
  fs.writeFileSync(invoicePdfPath, '%PDF-1.4\n1 0 obj <</Type/Catalog/Pages 2 0 R>> endobj 2 0 obj <</Type/Pages/Count 1/Kids [3 0 R]>> endobj 3 0 obj <</Type/Page/MediaBox [0 0 612 792]/Parent 2 0 R/Contents 4 0 R>> endobj 4 0 obj <</Length 11>> stream\nBT /F1 12 Tf 72 720 Td (Factura Ejemplo 12345) Tj ET\nendstream endobj\nxref\n0 5\n0000000000 65535 f\n0000000009 00000 n\n0000000057 00000 n\n0000000115 00000 n\n0000000216 00000 n\ntrailer\n<< /Size 5 /Root 1 0 R >>\nstartxref\n293\n%%EOF');
  console.log(`Creado un PDF ficticio para prueba en: ${invoicePdfPath}`);
}

// Asegúrate de que el directorio 'tmp' exista para los archivos de salida encriptados. 
if (!fs.existsSync('./tmp')) {
    fs.mkdirSync('./tmp');
}

encryptPdfInvoice(invoicePdfPath); // Llama a la función para encriptar el PDF de la factura