package com.example.pdfsigner.service;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Security;
import java.security.cert.Certificate;
import java.util.Calendar;

public class PDFSigner {

    private PrivateKey privateKey;
    private Certificate[] certificateChain;

    public PDFSigner(String keystorePath, String keystorePassword) throws Exception {
        Security.addProvider(new BouncyCastleProvider());
        KeyStore keystore = KeyStore.getInstance("PKCS12");
        keystore.load(new FileInputStream(keystorePath), keystorePassword.toCharArray());
        String alias = keystore.aliases().nextElement();
        privateKey = (PrivateKey) keystore.getKey(alias, keystorePassword.toCharArray());
        certificateChain = keystore.getCertificateChain(alias);
    }

    public void signPDF(File inputFile, File outputFile, String reason, String location, String dni, String beneficiario) throws Exception {
        PDDocument document = PDDocument.load(inputFile);
        PDSignature signature = new PDSignature();
        signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
        signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
        signature.setName(reason);
        signature.setLocation(location);
        signature.setSignDate(Calendar.getInstance());

        // Obtener la primera página
        PDPage firstPage = document.getPage(0);
        PDRectangle mediaBox = firstPage.getMediaBox();
        float pageWidth = mediaBox.getWidth();
        float pageHeight = mediaBox.getHeight();

        // Márgenes
        float marginRight = 50;
        float startX = pageWidth - marginRight;
        float startY = 50; // cerca de abajo (luego giramos el texto)

        PDPageContentStream contentStream = new PDPageContentStream(document, firstPage, PDPageContentStream.AppendMode.APPEND, true);
        contentStream.beginText();
        contentStream.setFont(org.apache.pdfbox.pdmodel.font.PDType1Font.HELVETICA_BOLD, 12);

        // Rotamos el sistema de coordenadas para escribir vertical
        contentStream.setTextMatrix(0, 1, -1, 0, startX, startY);

        String textoFirma = "Motivo: " + reason + "\nDNI: " + dni + "\nBeneficiario: " + beneficiario;
        for (String linea : textoFirma.split("\n")) {
            contentStream.showText(linea);
            contentStream.newLineAtOffset(0, -15);
        }

        contentStream.endText();
        contentStream.close();

        document.addSignature(signature, new CreateSignature(privateKey, certificateChain));
        try (FileOutputStream fos = new FileOutputStream(outputFile)) {
            document.saveIncremental(fos);
        }
        document.close();
    }
}
