/*******************************************************************************
 * Copyright (c) 2013, 2015 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Thibault Le Ouay <thibaultleouay@gmail.com> - Bug 443094
 *******************************************************************************/
package org.eclipse.e4.ui.css.swt.helpers;

import static org.eclipse.e4.ui.css.swt.helpers.CSSSWTColorHelper.COLOR_DEFINITION_MARKER;
import static org.eclipse.e4.ui.css.swt.helpers.CSSSWTFontHelper.FONT_DEFINITION_MARKER;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;

import org.eclipse.e4.ui.css.core.css2.CSS2FontHelper;
import org.eclipse.e4.ui.css.core.dom.properties.css2.CSS2FontProperties;
import org.eclipse.e4.ui.css.core.impl.dom.CSSValueImpl;
import org.eclipse.e4.ui.internal.css.swt.definition.IColorAndFontProvider;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.RGB;
import org.osgi.framework.FrameworkUtil;
import org.w3c.dom.DOMException;
import org.w3c.dom.css.CSSPrimitiveValue;
import org.w3c.dom.css.CSSValue;

public abstract class CSSSWTHelperTestCase {

	protected static final String CSS_ITALIC = CSS2FontHelper.getFontStyle(true);
	protected static final String CSS_BOLD = CSS2FontHelper.getFontWeight(true);

	protected void registerFontProviderWith(String expectedSymbolicName, String family, int size, int style) {
		IColorAndFontProvider provider = mock(IColorAndFontProvider.class);
		doReturn(new FontData[] { new FontData(family, size, style) }).when(provider).getFont(expectedSymbolicName);
		registerProvider(provider);
	}

	protected void registerColorProviderWith(String expectedSymbolicName, RGB rgb) {
		IColorAndFontProvider provider = mock(IColorAndFontProvider.class);
		doReturn(rgb).when(provider).getColor(expectedSymbolicName);
		registerProvider(provider);

	}

	private void registerProvider(final IColorAndFontProvider provider) {
		FrameworkUtil.getBundle(getClass()).getBundleContext().registerService(IColorAndFontProvider.class, provider,
				null);
	}

	protected CSS2FontProperties fontProperties(String family) {
		return fontProperties(family, null, null, null);
	}

	protected CSS2FontProperties fontProperties(String family, Object size, Object style, Object weight) {
		CSS2FontProperties result = mock(CSS2FontProperties.class);
		doReturn(valueImpl(family)).when(result).getFamily();
		if (size != null) {
			doReturn(valueImpl(size)).when(result).getSize();
		}
		if (style != null) {
			doReturn(valueImpl(style)).when(result).getStyle();
		}
		if (weight != null) {
			doReturn(valueImpl(weight)).when(result).getWeight();
		}
		return result;
	}

	private CSSValueImpl valueImpl(final Object value) {
		if (value != null) {
			return new CSSValueImpl() {
				@Override
				public String getCssText() {
					return value.toString();
				}

				@Override
				public String getStringValue() {
					return getCssText();
				}

				@Override
				public float getFloatValue(short valueType) throws DOMException {
					return Float.parseFloat(getCssText());
				}
			};
		}
		return null;
	}

	protected CSSValueImpl colorValue(String value) {
		return colorValue(value, CSSValue.CSS_PRIMITIVE_VALUE);
	}

	protected CSSValueImpl colorValue(String value, short type) {
		CSSValueImpl result = mock(CSSValueImpl.class);
		doReturn(CSSPrimitiveValue.CSS_STRING).when(result).getPrimitiveType();
		doReturn(type).when(result).getCssValueType();
		doReturn(value).when(result).getStringValue();
		doReturn(value).when(result).getCssText();
		return result;
	}

	protected String addFontDefinitionMarker(String fontDefinitionId) {
		return FONT_DEFINITION_MARKER + fontDefinitionId;
	}

	protected String addColorDefinitionMarker(String colorDefinitionId) {
		return COLOR_DEFINITION_MARKER + colorDefinitionId;
	}
}
