package com.fitbank.pdfmerger;

import lombok.extern.slf4j.Slf4j;
import java.awt.Component;
import java.awt.Dimension;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.JLabel;
import org.apache.pdfbox.pdfviewer.PDFPagePanel;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;

/**
 * Provee de una pagina de un pdf.
 *
 * @author FitBank CI
 */
@Slf4j
public class PdfPageSource implements PageSource {

    public static List<PdfPageSource> getPageSources(File file) {
        PDDocument doc;
        try {
            doc = PDDocument.load(file);
        } catch (IOException e) {
            log.error("", e);
            return Collections.EMPTY_LIST;
        }

        List<PdfPageSource> pageSources = new ArrayList<PdfPageSource>(doc.
                getNumberOfPages());
        List<PDPage> pages = doc.getDocumentCatalog().getAllPages();

        for (int i = 0; i < doc.getNumberOfPages(); i++) {
            PDPage page = (PDPage) pages.get(i);
            pageSources.add(new PdfPageSource(doc, page, file.getName(), i));
        }

        return pageSources;
    }

    private final PDDocument doc;

    private final PDPage page;

    private final int pageNumber;

    private final String name;

    private PdfPageSource(PDDocument doc, PDPage page, String name,
            int pageNumber) {
        this.doc = doc;
        this.page = page;
        this.name = name;
        this.pageNumber = pageNumber;
    }

    public void write(PDDocument doc) throws Exception {
        doc.addPage(page);
    }

    public void writeJPG(OutputStream out) throws Exception {
        ImageIO.write(page.convertToImage(), "jpg", out);
    }

    public Component getPreview() {
        try {
            PDFPagePanel pagePanel = new PDFPagePanel();
            pagePanel.setPage(page);
            PDRectangle mb = page.getMediaBox();
            Dimension d = new Dimension((int) mb.getWidth(),
                    (int) mb.getHeight());
            pagePanel.setSize(d);
            pagePanel.setMinimumSize(d);
            pagePanel.setMaximumSize(d);
            pagePanel.setPreferredSize(d);
            return pagePanel;
        } catch (IOException e) {
            log.error("", e);
            return new JLabel("Error cargando previsualización: " + e.
                    getLocalizedMessage());
        }
    }

    @Override
    public String toString() {
        return name + " [" + pageNumber + "]";
    }

}
