package com.fitbank.pdfmerger;

import lombok.extern.slf4j.Slf4j;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageDecoder;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.RenderedImage;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Hashtable;
import java.util.List;

/**
 * Lee páginas de un archivo tiff multipágina.
 *
 * @author FitBank CI
 */
@Slf4j
public class TiffPageSource extends ImagePageSource {

    public static List<TiffPageSource> getPageSources(File file) {
        ImageDecoder imageDecoder;
        try {
            imageDecoder = ImageCodec.createImageDecoder("tiff",
                    new FileInputStream(file), null);

            List<TiffPageSource> pageSources = new ArrayList<TiffPageSource>(imageDecoder.
                    getNumPages());

            for (int i = 0; i < imageDecoder.getNumPages(); i++) {
                BufferedImage image = toBufferedImage(imageDecoder.
                        decodeAsRenderedImage(i));
                pageSources.add(new TiffPageSource(image));
            }

            return pageSources;
        } catch (IOException e) {
            log.error("", e);
            return Collections.EMPTY_LIST;
        }
    }

    public static BufferedImage toBufferedImage(RenderedImage img) {
        if (img instanceof BufferedImage) {
            return (BufferedImage) img;
        }

        ColorModel cm = img.getColorModel();
        WritableRaster raster = cm.createCompatibleWritableRaster(img.getWidth(),
                img.getHeight());

        Hashtable properties = new Hashtable();
        String[] keys = img.getPropertyNames();
        if (keys != null) {
            for (String key : keys) {
                properties.put(key, img.getProperty(key));
            }
        }

        BufferedImage result = new BufferedImage(cm, raster,
                cm.isAlphaPremultiplied(), properties);

        img.copyData(raster);

        return result;
    }

    private final BufferedImage image;

    private TiffPageSource(BufferedImage image) {
        this.image = image;
    }

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

}
