/*=============================================================================#
 # Copyright (c) 2012, 2020 Stephan Wahlbrink and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 # which is available at https://www.apache.org/licenses/LICENSE-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 # 
 # Contributors:
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.internal.r.ui.dataeditor;

import java.util.List;

import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.graphics.Image;

import org.eclipse.statet.internal.r.ui.dataeditor.RDataEditorOutlinePage.VariablePropertyItem;
import org.eclipse.statet.ltk.model.core.elements.IModelElement;
import org.eclipse.statet.r.core.data.CombinedRElement;
import org.eclipse.statet.r.ui.RLabelProvider;
import org.eclipse.statet.r.ui.RUI;
import org.eclipse.statet.r.ui.dataeditor.IRDataTableVariable;
import org.eclipse.statet.r.ui.dataeditor.RDataTableColumn;
import org.eclipse.statet.rj.data.RDataUtils;
import org.eclipse.statet.rj.data.RObject;


public class RDataLabelProvider extends StyledCellLabelProvider {
	
	
	private final RLabelProvider fRLabelProvider= new RLabelProvider(
			RLabelProvider.NO_STORE_TYPE | RLabelProvider.COUNT | RLabelProvider.NAMESPACE);
	
	
	public RDataLabelProvider() {
	}
	
	
	public Image getImage(final IRDataTableVariable element) {
		switch (element.getVarType()) {
		case IRDataTableVariable.LOGI:
			return RUI.getImage(RUI.IMG_OBJ_COL_LOGI);
		case IRDataTableVariable.INT:
			return RUI.getImage(RUI.IMG_OBJ_COL_INT);
		case IRDataTableVariable.NUM:
			return RUI.getImage(RUI.IMG_OBJ_COL_NUM);
		case IRDataTableVariable.CPLX:
			return RUI.getImage(RUI.IMG_OBJ_COL_CPLX);
		case IRDataTableVariable.CHAR:
			return RUI.getImage(RUI.IMG_OBJ_COL_CHAR);
		case IRDataTableVariable.RAW:
			return RUI.getImage(RUI.IMG_OBJ_COL_RAW);
		case IRDataTableVariable.FACTOR:
			return RUI.getImage(RUI.IMG_OBJ_COL_FACTOR);
		case IRDataTableVariable.DATE:
			return RUI.getImage(RUI.IMG_OBJ_COL_DATE);
		case IRDataTableVariable.DATETIME:
			return RUI.getImage(RUI.IMG_OBJ_COL_DATETIME);
		default:
			return null;
		}
	}
	
	@Override
	public void update(final ViewerCell cell) {
		Image image;
		final StyledString text= new StyledString();
		final Object element= cell.getElement();
		if (element instanceof RDataTableContentDescription) {
			final RDataTableContentDescription description= (RDataTableContentDescription) element;
			if (description.getRElementStruct() instanceof CombinedRElement) {
				this.fRLabelProvider.update(cell, (IModelElement) description.getRElementStruct());
				super.update(cell);
				return;
			}
			switch (description.getRElementStruct().getRObjectType()) {
			case RObject.TYPE_VECTOR:
				image= RUI.getImage(RUI.IMG_OBJ_VECTOR);
				break;
			case RObject.TYPE_ARRAY:
				image= RUI.getImage(RUI.IMG_OBJ_VECTOR);
				break;
			case RObject.TYPE_DATAFRAME:
				image= RUI.getImage(RUI.IMG_OBJ_VECTOR);
				break;
			default:
				image= null;
				break;
			}
			text.append(description.getElementName().toString());
		}
		else if (element instanceof IRDataTableVariable) {
			final IRDataTableVariable variable= (IRDataTableVariable) element;
			image= getImage(variable);
			text.append(variable.getName());
			
			if (element instanceof RDataTableColumn) {
				final RDataTableColumn column= (RDataTableColumn) variable;
				text.append(" : ", StyledString.DECORATIONS_STYLER); //$NON-NLS-1$
				final List<String> classNames= column.getClassNames();
				text.append(classNames.get(0), StyledString.DECORATIONS_STYLER);
				for (int i= 1; i < classNames.size(); i++) {
					text.append(", ", StyledString.DECORATIONS_STYLER); //$NON-NLS-1$
					text.append(classNames.get(i), StyledString.DECORATIONS_STYLER);
				}
				if (!classNames.contains(RDataUtils.getStoreClass(column.getDataStore()))) {
					text.append(" (", StyledString.DECORATIONS_STYLER); //$NON-NLS-1$
					text.append(RDataUtils.getStoreAbbr(column.getDataStore()), StyledString.DECORATIONS_STYLER);
					text.append(")", StyledString.DECORATIONS_STYLER); //$NON-NLS-1$
				}
			}
		}
		else if (element instanceof VariablePropertyItem) {
			final VariablePropertyItem item= (VariablePropertyItem) element;
			image= null;
			text.append(item.getName());
			final int count= item.getCount();
			if (count >= 0) {
				text.append(" (", StyledString.COUNTER_STYLER); //$NON-NLS-1$
				text.append(Integer.toString(count), StyledString.COUNTER_STYLER);
				text.append(")", StyledString.COUNTER_STYLER); //$NON-NLS-1$
			}
		}
		else {
			image= null;
			text.append(element.toString());
		}
		
		cell.setText(text.getString());
		cell.setStyleRanges(text.getStyleRanges());
		cell.setImage(image);
		
		super.update(cell);
	}
	
	@Override
	public void dispose() {
		super.dispose();
		
		this.fRLabelProvider.dispose();
	}
	
}
