/**
 *                                                                            
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *                                                                            
 * All rights reserved. This program and the accompanying materials           
 * are made available under the terms of the Eclipse Public License v1.0       
 * which accompanies this distribution, and is available at                  
 * http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 * Contributors:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 */
package org.eclipse.osbp.xtext.reportdsl.common.item;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;

import javax.imageio.ImageIO;
import javax.inject.Inject;

import org.eclipse.birt.report.model.api.Expression;
import org.eclipse.birt.report.model.api.ExpressionHandle;
import org.eclipse.birt.report.model.api.ExpressionType;
import org.eclipse.birt.report.model.api.ImageHandle;
import org.eclipse.birt.report.model.api.ReportItemHandle;
import org.eclipse.birt.report.model.api.StructureFactory;
import org.eclipse.birt.report.model.api.activity.SemanticException;
import org.eclipse.birt.report.model.api.elements.DesignChoiceConstants;
import org.eclipse.birt.report.model.api.elements.structures.EmbeddedImage;
import org.eclipse.birt.report.model.api.util.StringUtil;
import org.eclipse.birt.report.model.core.Module;
import org.eclipse.birt.report.model.elements.interfaces.IImageItemModel;
import org.eclipse.birt.report.model.i18n.ThreadResources;
import org.eclipse.osbp.ui.api.themes.IThemeResourceService;
import org.eclipse.osbp.ui.api.themes.IThemeResourceService.ThemeResourceType;
import org.eclipse.osbp.xtext.reportdsl.DatamartTableAttribute;
import org.eclipse.osbp.xtext.reportdsl.TableValueElement;
import org.eclipse.osbp.xtext.reportdsl.UnitEnum;
import org.eclipse.osbp.xtext.reportdsl.jvmmodel.ReportGeneratorWorkSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ibm.icu.util.ULocale;



public class ImageItem implements BaseItem {

	private static final Logger LOGGER = LoggerFactory.getLogger(ImageItem.class);
	private final ImageHandle fItem;

    @Inject
    private IThemeResourceService themeResourceService; 
	
	public ImageItem(ReportGeneratorWorkSet workset, DatamartTableAttribute tableAttribute) {
		this(workset, DataUtils.getAttributeName(tableAttribute), DesignChoiceConstants.IMAGE_SIZE_SIZE_TO_IMAGE, -1.0d, -1.0d,	null, -1.0d, null, DesignChoiceConstants.IMAGE_REF_TYPE_EXPR, null);
	}
	
	public ImageItem(
			ReportGeneratorWorkSet workset, 
			String name, 
			String size, 
			double scale, 
			double height, 
			UnitEnum heightUnit, 
			double width, 
			UnitEnum widthUnit, 
			String source, 
			String filename) {
		fItem = workset.getFactory().newImage(name);
		try {
			fItem.setSize(size);
			if	(scale <= 0.0) {
				fItem.setScale(1.0);
			} else {
				fItem.setScale(scale);
				fItem.setProportionalScale(true);
			}
			Module module = fItem.getModule();
			ULocale locale = module == null ? ThreadResources.getLocale( ) : module
					.getLocale( );
			if (height > 0.0) {
				fItem.setHeight(workset.getLocalizedDoubleValue(fItem, height, heightUnit));
			}
			if (width > 0.0) {
				fItem.setWidth(workset.getLocalizedDoubleValue(fItem, width, widthUnit));
			}
			fItem.setSource(source);
			switch (source) {
				case DesignChoiceConstants.IMAGE_REF_TYPE_URL:
					fItem.setURL(filename);
					ExpressionHandle eh1 = fItem.getExpressionProperty(IImageItemModel.URI_PROP);
					eh1.setType(ExpressionType.CONSTANT);
					break;
				case DesignChoiceConstants.IMAGE_REF_TYPE_FILE:
					fItem.setFile(filename);
					ExpressionHandle eh2 = fItem.getExpressionProperty(IImageItemModel.URI_PROP);
					eh2.setType(ExpressionType.CONSTANT);
					break;
				case DesignChoiceConstants.IMAGE_REF_TYPE_EMBED:
					String imageId = DesignChoiceConstants.IMAGE_REF_TYPE_EMBED + "." + filename.replaceAll("\\W", "");
					EmbeddedImage ei = workset.getEmbeddedImage(imageId);
					if	(ei == null) {
						ei = createEmbeddedImage(workset, filename, imageId);
					}
					workset.getDesign().addImage(ei);
					fItem.setImageName(imageId);
					break;
				case DesignChoiceConstants.IMAGE_REF_TYPE_EXPR:
					Expression expr = new Expression("row[\"" + name + "\"]", null);
					fItem.setExpressionProperty("valueExpr", expr);
					break;
				default:
					break;
			}
		}
		catch (Exception e) {
			StringWriter sw = new StringWriter();
			e.printStackTrace(new PrintWriter(sw));
			String exceptionDetails = sw.toString();
			LOGGER.error("{}", exceptionDetails);
		}
	}

	private EmbeddedImage createEmbeddedImage(ReportGeneratorWorkSet workset, String filename, String imageId) {
		EmbeddedImage ei = null;
		try {
			String[] tokens = null;
			InputStream stream = null;
			if	(themeResourceService != null) {
				String uri = themeResourceService.getThemeURI(filename, ThemeResourceType.ICON);
				stream = themeResourceService.getThemeResourceInputStream(uri);
				tokens = uri.split("\\.");
			} else {
				File file = new File(filename);
				tokens = filename.split("\\.");
				stream = new FileInputStream(file);
			}
			String fileextension = tokens[tokens.length-1];
			BufferedImage originalImage = ImageIO.read(stream);
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ImageIO.write(originalImage, fileextension, baos);
			baos.flush();
			byte[] imageInByte = baos.toByteArray();
			baos.close();
			ei = StructureFactory.createEmbeddedImage();
			ei.setType(getImageType(fileextension));
			ei.setData(imageInByte);
			ei.setName(imageId);
			workset.putEmbeddedImage(imageId, ei);
		}
		catch (Exception e) {
			StringWriter sw = new StringWriter();
			e.printStackTrace(new PrintWriter(sw));
			String exceptionDetails = sw.toString();
			LOGGER.error("{}", exceptionDetails);
		}
		return ei;
	}
	
	@Override
	public ReportItemHandle getHandle() {
		return fItem;
	}

	private String getImageType(String fileextension) {
		switch (fileextension.toLowerCase()) {
			case "bmp": 	return DesignChoiceConstants.IMAGE_TYPE_IMAGE_BMP;
			case "gif": 	return DesignChoiceConstants.IMAGE_TYPE_IMAGE_GIF;
			case "png": 	return DesignChoiceConstants.IMAGE_TYPE_IMAGE_PNG;
			case "jpg":	
			case "jpeg":	return DesignChoiceConstants.IMAGE_TYPE_IMAGE_JPEG;
			case "ico": 	return DesignChoiceConstants.IMAGE_TYPE_IMAGE_ICO;
			case "tiff":	return DesignChoiceConstants.IMAGE_TYPE_IMAGE_TIFF;
			case "svg":		return DesignChoiceConstants.IMAGE_TYPE_IMAGE_SVG;
			default:		return null;
		}
	}
}
