package ru.mcs.udk.scanner.impl;

import net.sourceforge.tess4j.TesseractException;
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.pdfbox.text.PDFTextStripper;
import ru.mcs.udk.wrapper.DocumentFormat;
import ru.mcs.udk.wrapper.DocumentInfo;
import ru.mcs.udk.scanner.DocumentScanner;
import ru.mcs.udk.utils.DocumentUtils;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;

import static ru.mcs.udk.utils.DocumentUtils.findUDK;
import static ru.mcs.udk.utils.DocumentUtils.isCyrillic;

public class PDFScanner implements DocumentScanner {

    @Override
    public DocumentInfo getUDK(File file) {
        // Засекаем время начала поиска
        long startTime = System.currentTimeMillis();
        DocumentInfo documentInfo = new DocumentInfo();
        documentInfo.setError("");
        documentInfo.setUdk("");
        documentInfo.setDocumentFormat(DocumentFormat.PDF);
        documentInfo.setFileSize(getSizeFile(file));
        try (PDDocument document = Loader.loadPDF(file)) {
            PDFTextStripper stripper = new PDFTextStripper();
            // Устанавливаем диапазон страниц для анализа (первые три страницы)
            stripper.setStartPage(1);
            stripper.setEndPage(Math.min(3, document.getNumberOfPages()));
            String text = stripper.getText(document);
            documentInfo.setUdk(findUDK(text));

            documentInfo.setLanguage(isCyrillic(file.getName()) ? "ru" : "en");

            if ((documentInfo.getUdk() == null || documentInfo.getUdk().isBlank()) && documentInfo.getLanguage().equals("ru")) {
                documentInfo.setUdk(getUdkByImage(document));
            }
        } catch (IOException | TesseractException e) {
            documentInfo.setError(e.getMessage());
        }
        long endTime = System.currentTimeMillis();
        documentInfo.setTime(endTime - startTime);
        return documentInfo;
    }

    private String getSizeFile(File file) {
        double sizeInMB = (double) file.length() / (1024 * 1024); // Размер в мегабайтах
        DecimalFormat df = new DecimalFormat("#.##"); // Форматирование до двух знаков после запятой

        return df.format(sizeInMB) + " Mb";
    }

    private static String getUdkByImage(PDDocument document) throws IOException, TesseractException {
        PDFRenderer renderer = new PDFRenderer(document);

        for (int pageIndex = 0; pageIndex < 6; pageIndex++) {
            BufferedImage image = renderer.renderImageWithDPI(pageIndex, 300);
            String text = DocumentUtils.getText(image);
            String udk = findUDK(text);
            if (udk != null) {
                return udk;
            }
        }
        return "";
    }
}
