/*******************************************************************************
 * Copyright (c) 2008, 2013 Angelo Zerr 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:
 *     Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
 *******************************************************************************/
package org.eclipse.e4.ui.css.core.css2;

import org.eclipse.e4.ui.css.core.dom.properties.css2.CSS2FontProperties;
import org.eclipse.e4.ui.css.core.dom.properties.css2.CSS2FontPropertiesImpl;
import org.eclipse.e4.ui.css.core.engine.CSSElementContext;
import org.w3c.dom.css.CSSPrimitiveValue;
import org.w3c.dom.css.CSSValue;
import org.w3c.dom.css.CSSValueList;

/**
 *
 * @version 1.0.0
 * @author <a href="mailto:angelo.zerr@gmail.com">Angelo ZERR</a>
 *
 */
public class CSS2FontPropertiesHelpers {

	/**
	 * Constant used to store {@link CSS2FontProperties} instance into
	 * {@link CSSElementContext} context.
	 */
	public static final String CSS2FONT_KEY = "org.eclipse.e4.ui.css.core.css2.CSS2FONT_KEY";

	/**
	 * Get {@link CSS2FontProperties} from {@link CSSElementContext} context.
	 *
	 * @param control
	 * @return
	 */
	public static CSS2FontProperties getCSS2FontProperties(CSSElementContext context) {
		// Search into Data of context if CSS2FontProperties exist.
		return (CSS2FontProperties) context.getData(CSS2FONT_KEY);
	}

	/**
	 * Set {@link CSS2FontProperties} <code>fontProperties</code> into
	 * {@link CSSElementContext} context.
	 *
	 * @param fontProperties
	 * @param context
	 */
	public static void setCSS2FontProperties(CSS2FontProperties fontProperties, CSSElementContext context) {
		if (fontProperties == null) {
			return;
		}
		context.setData(CSS2FONT_KEY, fontProperties);
	}

	/**
	 * Create and return {@link CSS2FontProperties} instance from
	 * <code>value</code>.
	 *
	 * @param value
	 * @param property
	 * @return
	 */
	public static CSS2FontProperties createCSS2FontProperties(CSSValue value, String property) {
		CSS2FontProperties fontProperties = new CSS2FontPropertiesImpl();
		updateCSSPropertyFont(fontProperties, property, value);
		return fontProperties;
	}

	/**
	 * Update the <code>property of</code> <code>fontProperties</code> instance with
	 * the <code>value</code>.
	 *
	 * @param fontProperties
	 * @param property
	 * @param value
	 */
	public static void updateCSSPropertyFont(CSS2FontProperties fontProperties, String property, CSSValue value) {
		switch (property) {
		case "font-family":
			updateCSSPropertyFontFamily(fontProperties, value);
			break;
		case "font-size":
			updateCSSPropertyFontSize(fontProperties, value);
			break;
		case "font-style":
			updateCSSPropertyFontStyle(fontProperties, value);
			break;
		case "font-weight":
			updateCSSPropertyFontWeight(fontProperties, value);
			break;
		case "font":
			updateCSSPropertyFontComposite(fontProperties, value);
			break;
		default:
			break;
		}
	}

	/**
	 * Update <code>fontProperties</code> instance with the {@link CSSValue}
	 * <code>value</code>. value can be {@link CSSPrimitiveValue} or
	 * {@link CSSValueList}.
	 *
	 * @param font
	 * @param value
	 */
	public static void updateCSSPropertyFontComposite(CSS2FontProperties font, CSSValue value) {
		if (value.getCssValueType() == CSSValue.CSS_VALUE_LIST) {
			CSSValueList valueList = (CSSValueList) value;
			int length = valueList.getLength();
			for (int i = 0; i < length; i++) {
				CSSValue value2 = valueList.item(i);
				updateCSSPropertyFontComposite(font, value2);
			}
		} else if (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {
			String property = CSS2FontHelper.getCSSFontPropertyName((CSSPrimitiveValue) value);
			updateCSSPropertyFont(font, property, value);
		}
	}

	/**
	 * Update CSS2FontProperties instance with font-family.
	 *
	 * @param font
	 * @param value
	 * @throws Exception
	 */
	public static void updateCSSPropertyFontFamily(CSS2FontProperties font, CSSValue value) {
		if (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {
			font.setFamily((CSSPrimitiveValue) value);
		}
	}

	/**
	 * Update CSS2FontProperties instance with font-size.
	 *
	 * @param font
	 * @param value
	 * @throws Exception
	 */
	public static void updateCSSPropertyFontSize(CSS2FontProperties font, CSSValue value) {
		if (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {
			font.setSize((CSSPrimitiveValue) value);
		}
	}

	/**
	 * Update CSS2FontProperties instance with font-style.
	 *
	 * @param font
	 * @param value
	 * @throws Exception
	 */
	public static void updateCSSPropertyFontStyle(CSS2FontProperties font, CSSValue value) {
		if (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {
			font.setStyle((CSSPrimitiveValue) value);
		}
	}

	/**
	 * Update CSS2FontProperties instance with font-weight.
	 *
	 * @param font
	 * @param value
	 * @throws Exception
	 */
	public static void updateCSSPropertyFontWeight(CSS2FontProperties font, CSSValue value) {
		if (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {
			font.setWeight((CSSPrimitiveValue) value);
		}
	}
}
