package org.wikiwebserver.distribute.se.worker.task;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedList;

import org.wikiwebserver.distribute.interfaces.Generator;
import org.wikiwebserver.distribute.interfaces.Task;
import org.wikiwebserver.distribute.se.ConfigManager;

public class ImageListingTask extends Task implements Generator {
    
    public static final int THUMBNAIL_SIZE = 210;
    public static final int NUM_THUMB_COLS = 3;
    public static final int NUM_THUMB_ROWS = 3;
    public static final int THUMB_HORIZ_PADDING = 10;
    public static final int THUMB_VERT_PADDING = 10;    
    public static final String[] IMAGE_EXTS = { "jpg", "jpeg", "jpe", "gif", "bmp", "png" };    

	private static final long serialVersionUID = 1L;
	

	
	private File dir = null;
	private byte[] resizedImageData = null;
	
	public Object generate() throws IOException {

	    int idx = getTaskInputMeta().indexOf('|');
	    int offset = Integer.parseInt(getTaskInputMeta().substring(0, idx));
	    String path = getTaskInputMeta().substring(idx+1);
	    
	    dir = ConfigManager.getFileForPath(path);
		if (!dir.exists()) {
			throw new FileNotFoundException(dir.getPath());
		}		
		
        if (!dir.isDirectory()) {
            throw new IOException("Directory expected:" + dir.getPath());
        }   		
		
		LinkedList<File> images = new LinkedList<File>();
		for (File file : dir.listFiles()) {
		    for (String ext : IMAGE_EXTS) {
    		    if (file.getName().toLowerCase().endsWith(ext)) {
    		        images.add(file);
    		        break;
    		    }
		    }
		}
		
        int totalWidth = (THUMB_HORIZ_PADDING*2 + THUMBNAIL_SIZE) * NUM_THUMB_COLS;		
		int totalHeight = (THUMB_VERT_PADDING*2 + THUMBNAIL_SIZE) * NUM_THUMB_ROWS;
		
		
        BufferedImage galleryImage = new BufferedImage(totalWidth, totalHeight, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = galleryImage.createGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
        g2d.setColor(Color.white);
        g2d.fillRect(0, 0, totalWidth, totalHeight);
        
        Iterator<File> ii = images.iterator();
        for (int i=0; i<offset && ii.hasNext(); i++) {
            ii.next();
        }
        
        g2d.setColor(new Color(200, 200, 200));
        for (int r=0; r<NUM_THUMB_ROWS; r++) {
            for (int c=0; c<NUM_THUMB_COLS; c++) {
                if (ii.hasNext()) {
                    File file = ii.next();
                    BufferedImage scaledImage = ImagePostTask.getScaledImage(file, THUMBNAIL_SIZE);
                    int gridX = THUMB_HORIZ_PADDING + c * (THUMBNAIL_SIZE + THUMB_HORIZ_PADDING*2);
                    int gridY = THUMB_VERT_PADDING + r * (THUMBNAIL_SIZE + THUMB_VERT_PADDING*2);
                    
                    int imageWidth = scaledImage.getWidth();
                    int imageHeight = scaledImage.getHeight();
                    int offsetX = (THUMBNAIL_SIZE - imageWidth) / 2;
                    int offsetY = (THUMBNAIL_SIZE - imageHeight) / 2;
                    g2d.drawImage(scaledImage, gridX+offsetX, gridY+offsetY, imageWidth, imageHeight, Color.white, null);  
                    
                    g2d.drawRect(gridX, gridY, THUMBNAIL_SIZE, THUMBNAIL_SIZE);                    
                }
            }
        }	

        resizedImageData = ImagePostTask.getBytes(galleryImage);
        
        setTaskOutputMeta(String.valueOf(getStreamLength()));        
        
        return resizedImageData;
	}
	
    public long getStreamLength() {
        return resizedImageData.length;
    }   
    
    public String toString() {
        if (dir == null) return "Starting...";
        return "Posting index image " + dir;
    }     
}

