package com.fitbank.pdfmerger;

import lombok.extern.slf4j.Slf4j;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Transformer;

/**
 * Clase para manejar el PDFMerger desde java.
 *
 * @author FitBank CI
 */
@Slf4j
public class PDFMerger {

    public static void open() {
        new Main().setVisible(true);
    }

    public static void open(PageSourceProvider provider) {
        new Main(null, -1, provider, false).setVisible(true);
    }

    public static void compose(List<BufferedImage> images, OutputStream out,
            int numberOfPages, PageSourceProvider provider) {
        Main main = new Main(out, numberOfPages, provider, false);
        main.setVisible(true);
        try {
            main.waitDone();
        } catch (InterruptedException e) {
            log.error("", e);
        }
    }

    public static void compose(List<BufferedImage> images, OutputStream out,
            int numberOfPages, PageSourceProvider provider, boolean oneAsJPG) {
        Main main = new Main(out, numberOfPages, provider, oneAsJPG);
        main.setVisible(true);
        try {
            main.waitDone();
        } catch (InterruptedException e) {
            log.error("", e);
        }
    }

    public static void write(List<BufferedImage> images, OutputStream out)
            throws IOException {
        PagesListModel pagesListModel = new PagesListModel();

        pagesListModel.addAll(0, new LinkedList<PageSource>(CollectionUtils.
                collect(images, new Transformer() {

            public Object transform(final Object input) {
                return new ImagePageSource() {

                    @Override
                    protected BufferedImage getImage() throws Exception {
                        return (BufferedImage) input;
                    }

                };
            }

        })));

        pagesListModel.savePDF(out);
    }

}
