/*=============================================================================#
 # 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.element.LtkModelElement;
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, (LtkModelElement) 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();
	}
	
}
