/*******************************************************************************
 * Copyright (c) 2013 Ericsson
 * 
 * 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
 * 
 * Description:
 * 	This class implements the implementation of the R4E-Gerrit UI view label provider.
 * 
 * Contributors:
 *   Jacques Bouthillier - Initial Implementation of the label provider
 ******************************************************************************/

package org.eclipse.mylyn.reviews.r4e_gerrit.ui.internal.model;

import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.viewers.ITableColorProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.mylyn.reviews.r4e_gerrit.core.R4EGerritTask;
import org.eclipse.mylyn.reviews.r4e_gerrit.ui.R4EGerritUi;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;

/**
 * @author Jacques Bouthillier
 * @version $Revision: 1.0 $
 * 
 */
public class ReviewTableLabelProvider extends LabelProvider implements
		ITableLabelProvider, ITableColorProvider {

	// ------------------------------------------------------------------------
	// Constants
	// ------------------------------------------------------------------------
	
    private final String EMPTY_STRING = "";

	// +2 Names of images used to represent review-checked
	public static final String CHECKED_IMAGE = "greenCheck";

	// -2 Names of images used to represent review-not OK
	public static final String NOT_OK_IMAGE = "redNot";

	// -1
	public static final String MINUS_ONE = "minusOne";

	// +1
	public static final String PLUS_ONE = "plusOne";

	// Names of images used to represent STAR FILLED
	public static final String STAR_FILLED = "starFilled";

	// Names of images used to represent STAR OPEN
	public static final String STAR_OPEN = "starOpen";

	// Value stored to define the state of the review item.
	public static final int NOT_OK_IMAGE_STATE = -2;
	public static final int CHECKED_IMAGE_STATE = 2;

	// Constant for the column with colors: CR, IC and V
	private static Display fDisplay = Display.getCurrent();
	private static Color RED = fDisplay.getSystemColor(SWT.COLOR_RED);
	private static Color GREEN = fDisplay.getSystemColor(SWT.COLOR_DARK_GREEN);
	//Color used depending on the review state
	private static Color DEFAULT_COLOR = fDisplay.getSystemColor(SWT.COLOR_LIST_BACKGROUND);
//	private static Color INCOMING_COLOR = fDisplay.getSystemColor(SWT.COLOR_TITLE_BACKGROUND);
	private static Color INCOMING_COLOR = fDisplay.getSystemColor(SWT.COLOR_WHITE);
	private static Color CLOSED_COLOR = fDisplay.getSystemColor(SWT.COLOR_WHITE);
//	private static Color INCOMING_COLOR = fDisplay.getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW);
//	private static Color CLOSED_COLOR = fDisplay.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW);

	// For the images
	private static ImageRegistry fImageRegistry = new ImageRegistry();

	/**
	 * Note: An image registry owns all of the image objects registered with it,
	 * and automatically disposes of them the SWT Display is disposed.
	 */
	static {
		
		String iconPath = "icons/view16/";

		fImageRegistry.put(CHECKED_IMAGE,
				R4EGerritUi.getImageDescriptor(iconPath + CHECKED_IMAGE + ".png"));

		fImageRegistry.put(NOT_OK_IMAGE,
				R4EGerritUi.getImageDescriptor(iconPath + NOT_OK_IMAGE + ".png"));

		fImageRegistry.put(MINUS_ONE,
				R4EGerritUi.getImageDescriptor(iconPath + MINUS_ONE + ".png"));

		fImageRegistry.put(PLUS_ONE,
				R4EGerritUi.getImageDescriptor(iconPath + PLUS_ONE + ".png"));

		fImageRegistry.put(STAR_FILLED,
				R4EGerritUi.getImageDescriptor(iconPath + STAR_FILLED + ".gif"));

		fImageRegistry.put(STAR_OPEN,
				R4EGerritUi.getImageDescriptor(iconPath + STAR_OPEN + ".gif"));
	}

	// ------------------------------------------------------------------------
	// Constructors
	// ------------------------------------------------------------------------
	public ReviewTableLabelProvider() {
	}

	// ------------------------------------------------------------------------
	// Methods
	// ------------------------------------------------------------------------

	/**
	 * Return an image representing the state of the object
	 * 
	 * @param int aState
	 * @return Image
	 */
	private Image getReviewStateImage(int aState) {
		switch (aState) {
		case 2:
			return fImageRegistry.get(CHECKED_IMAGE);
		case 1:
			return fImageRegistry.get(PLUS_ONE);
		case 0:
			break;
		case -1:
			return fImageRegistry.get(MINUS_ONE);
		case -2:
			return fImageRegistry.get(NOT_OK_IMAGE);
		default:
			break;
		}
		return null;
	}

	/**
	 * Return an image representing the state of the object
	 * 
	 * @param int aState
	 * @return Image
	 */
	private Image getVerifyStateImage(int aState) {
		switch (aState) {
		case 1:
			return fImageRegistry.get(CHECKED_IMAGE);
		case 0:
			break;
		case -1:
			return fImageRegistry.get(NOT_OK_IMAGE);
		default:
			break;
		}
		return null;
	}

	/**
	 * Return an image representing the state of the ID object
	 * 
	 * @param Boolean
	 *            aState
	 * @return Image
	 */
	private Image getReviewId(Boolean aState) {
		if (aState) {
			// True means the star is filled ??
			return fImageRegistry.get(STAR_FILLED);
		} else {
			//
			return fImageRegistry.get(STAR_OPEN);
		}
	}

	/**
	 * Return the text associated to the column
	 * 
	 * @param Object
	 *            structure of the table
	 * @param int column index
	 * 
	 * @return String text associated to the column
	 */
	@SuppressWarnings("restriction")
	public String getColumnText(Object aObj, int aIndex) {
		// R4EGerritPlugin.Ftracer.traceWarning("getColumnText object: " + aObj
		// + "\tcolumn: " + aIndex);
		if (aObj instanceof R4EGerritTask) {
			R4EGerritTask reviewSummary = (R4EGerritTask) aObj;
//			String value = null;
			switch (aIndex) {
			case 0:
				return reviewSummary.getAttribute(R4EGerritTask.IS_STARRED); // Needed for the sorter
			case 1:
				return reviewSummary.getAttribute(R4EGerritTask.SHORT_CHANGE_ID); 
			case 2:
				return reviewSummary.getAttribute(R4EGerritTask.SUBJECT); 
			case 3:
				return reviewSummary.getAttribute(R4EGerritTask.OWNER); 
			case 4:
				return reviewSummary.getAttribute(R4EGerritTask.PROJECT); 
			case 5:
				return reviewSummary.getAttribute(R4EGerritTask.BRANCH); 
			case 6:
				return reviewSummary.getAttributeAsDate(R4EGerritTask.DATE_MODIFICATION); 
//			case 7:
//				value = reviewSummary.getAttribute(R4EGerritTask.REVIEW_STATE);
//				if (null != value && !value.equals(EMPTY_STRING)) {
//					return formatValue (value);
//				}
//			case 8:
//				value = reviewSummary.getAttribute(R4EGerritTask.IS_IPCLEAN);
//				if (null != value && !value.equals(EMPTY_STRING)) {
//					return formatValue (value);
//				}
//                return EMPTY_STRING; 
//			case 9:
//				value = reviewSummary.getAttribute(R4EGerritTask.VERIFY_STATE);
//				if (null != value && !value.equals(EMPTY_STRING)) {
//					return formatValue (value);
//				}
//                return EMPTY_STRING; 
			default:
				return EMPTY_STRING;
			}
		}
		return EMPTY_STRING;
	}

	
//	/**
//	 * Format the numbering value to display
//	 * @param aSt
//	 * @return String
//	 */
//	private String formatValue (String aSt) {
//		int val = aSt.equals("")? 0 : Integer.parseInt(aSt, 10);
//		if ( val > 0) {
//			String st = "+" + aSt;
//			return st;
//		}
//		return aSt; 
//
//	}

	/**
	 * Return the image associated to the column
	 * 
	 * @param Object
	 *            structure of the table
	 * @param int column index
	 * 
	 * @return Image Image according to the selected column
	 */
	@SuppressWarnings("restriction")
	public Image getColumnImage(Object aObj, int aIndex) {
		// R4EGerritPlugin.Ftracer
		// .traceWarning("getColumnImage column: " + aIndex);
		Image image = null;
		String value = null;
		if (aObj instanceof R4EGerritTask) {
			R4EGerritTask reviewSummary = (R4EGerritTask) aObj;
			switch (aIndex) {
			case 0:
				value = reviewSummary.getAttribute(R4EGerritTask.IS_STARRED);
				if (null != value && !value.equals(EMPTY_STRING)) {
					return getReviewId(Boolean.valueOf(value.toLowerCase()));
				}
				break;
			case 1:
				return image;
			case 2:
				return image;
			case 3:
				return image;
			case 4:
				return image;
			case 5:
				return image;
			case 6:
				return image;
			case 7:
				value = reviewSummary.getAttribute(R4EGerritTask.REVIEW_STATE);

				if (null != value && !value.equals(EMPTY_STRING)) {
					int val = Integer.parseInt(value);
					return getReviewStateImage(val);
				}
				break;
			case 8:
//				value = reviewSummary.getAttribute(R4EGerritTask.IS_IPCLEAN);
//
//				if (null != value && !value.equals(EMPTY_STRING)) {
//					int val = Integer.parseInt(value);
//					return getReviewSate(val);
//				}
//				break;
//			case 9:
				value = reviewSummary.getAttribute(R4EGerritTask.VERIFY_STATE);

				if (null != value && !value.equals(EMPTY_STRING)) {
					int val = Integer.parseInt(value);
					return getVerifyStateImage(val);
				}
				break;
			default:
				return image;
			}
		}

		return image;
	}

	/**
	 * Adjust the column color
	 * 
	 * @param Object
	 *            ReviewTableListItem
	 * @param int columnIndex
	 */
	@Override
	public Color getForeground(Object aElement, int aColumnIndex) {
		if (aElement instanceof R4EGerritTask) {
			R4EGerritTask item = (R4EGerritTask) aElement;
			int value = 0;
			String st = null;
			// R4EGerritPlugin.Ftracer.traceWarning("getForeground() object CR : "
			// + item.getCr() + "\tcolumn : " + aColumnIndex );
			if (aColumnIndex == ReviewTableDefinition.CR.ordinal()
//					|| aColumnIndex == ReviewTableDefinition.IC.ordinal()
					|| aColumnIndex == ReviewTableDefinition.VERIFY.ordinal()) {
				switch (aColumnIndex) {
				case 7: // ReviewTableDefinition.CR.ordinal():
//					st = item.getAttribute(R4EGerritTask.REVIEW_STATE);
//					if (st != null) {
//						value = st.equals(EMPTY_STRING) ? 0 : Integer
//								.parseInt(st);						
//					}
					break;
				case 8: // ReviewTableDefinition.IC.ordinal():
//					st = item.getAttribute(R4EGerritTask.IS_IPCLEAN);
//					if (st != null) {
//						value = st.equals(EMPTY_STRING) ? 0 : Integer
//								.parseInt(st);						
//					}
//					break;
//				case 9: // ReviewTableDefinition.VERIFY.ordinal():
//					st = item.getAttribute(R4EGerritTask.VERIFY_STATE);
//					if (st != null) {
//						value = st.equals(EMPTY_STRING) ? 0 : Integer
//								.parseInt(st);						
//					}
					break;
				}
				if (value < 0) {
					return RED;
				} else if (value > 0) {
					return GREEN;
				}
			}
		}
		return null;
	}

	@Override
	@SuppressWarnings("restriction")
	public Color getBackground(Object aElement, int aColumnIndex) {
		// R4EGerritUi.Ftracer.traceInfo("getBackground column : " +
		// aColumnIndex +
		// " ]: "+ aElement );
		if (aElement instanceof R4EGerritTask) {
			R4EGerritTask item = (R4EGerritTask) aElement;
			//
			// To modify when we can verify the review state
			String state = item
					.getAttribute(R4EGerritTask.IS_STARRED);
			if (state != null) {
				if (state.equals("true")) {
					return INCOMING_COLOR;

				} else if (state.equals("false")) {
					return CLOSED_COLOR;
				}
			}
		}

		return DEFAULT_COLOR;
	}

}
