package camera;

import java.io.*;

import org.apache.sanselan.ImageReadException;
import org.apache.sanselan.ImageWriteException;
import org.apache.sanselan.formats.jpeg.exifRewrite.ExifRewriter;
import org.apache.sanselan.formats.tiff.write.TiffOutputSet;
import org.osgi.framework.BundleContext;
import org.osgi.service.log.LogService;

public class Store {
	private final static String JPEG_EXTENSION = ".jpg";
	private final LogService log;
	private final File dir;
	private File [] imageFiles;
	private int imageIndex;
	private final ExifRewriter exifRewriter = new ExifRewriter();
	// TODO: Shouldn't need this...
	private static final boolean VIRTUAL_BUG = false;

	public Store(final BundleContext bundleContext, final LogService log) {
		this.log = log;
		
		final File dummy;
		// TODO: use bundleContext once the always-init issue has been addressed
		if (VIRTUAL_BUG) {
			dummy = new File("/Users/dave/Pictures/temppics/dummy");			
		}
		else {
			// TODO: go back to bundle context when UAM stuff is sorted out 
			dummy = bundleContext.getDataFile("dummy");
			//dummy = new File("/home/root/dummy");			
		}

		// TODO: why doesn't passing a blank name work, like the javadoc says it should?
		this.dir = dummy.getParentFile();
		if (!dir.isDirectory()) {
			log.log(LogService.LOG_ERROR, dir + " is not a directory");
			throw new RuntimeException("storage dir is not a dir");
		}
	}

	
	public boolean saveImage(final byte [] imageData,
			final String name,
			TiffOutputSet exifData) {
		final File imageFile = new File(dir, name + JPEG_EXTENSION);
		log.log(LogService.LOG_INFO, "Saving image to " + imageFile);
		try {
			final FileOutputStream fos = new FileOutputStream(imageFile);
			exifRewriter.updateExifMetadataLossy(imageData, fos, exifData);
			fos.close();
			return true;
		}
		catch (ImageReadException e) {
			e.printStackTrace();
			return false;
		}
		catch (ImageWriteException e) {
			e.printStackTrace();
			return false;
		}
		catch (IOException e) {
			e.printStackTrace();
			return false;
		}		
	}
	
	public boolean deleteImage(final File imageFile) {
		log.log(LogService.LOG_INFO, "Deleting image " + imageFile);
		return imageFile.delete();
	}
		
	public void refresh() {
		imageFiles = dir.listFiles(new FilenameFilter() {
			public boolean accept(File dir, String name) {
				// TODO: use some set of valid extensions, not just one
				return name.endsWith(JPEG_EXTENSION);
			}
		});
		imageIndex = imageFiles.length - 1;
	}
	
	public int getImageCount() {
		log.log(LogService.LOG_DEBUG, "Store has " + imageFiles.length + " images");
		return imageFiles.length;
	}
	
	public void nextImage() {
		imageIndex++;
		if (imageIndex >= imageFiles.length) {
			imageIndex = 0;
		}
		log.log(LogService.LOG_DEBUG, "image index now " + imageIndex);
	}
	
	public void prevImage() {
		imageIndex--;
		if (imageIndex < 0) {
			imageIndex = imageFiles.length - 1;
		}
		log.log(LogService.LOG_DEBUG, "image index now " + imageIndex);
	}
	
	public int getImageIndex() {
		return imageIndex;
	}
	
	public File getImageFile() {
		if (imageFiles.length == 0) {
			return null;
		}
		return imageFiles[imageIndex];
	}
}