/*******************************************************************************
 * Copyright (c) 2008, 2019 SWTChart project.
 *
 * 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/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 * yoshitaka - initial API and implementation
 * Frank Buloup - Internationalization
 *******************************************************************************/
package org.eclipse.swtchart.internal.compress;

/**
 * Configuration for compression.
 */
public class CompressConfig {

	/** the width in pixels */
	private long widthInPixels;
	/** the height in pixels */
	private long heightInPixels;
	/** the lower value of X range */
	private double xLowerValue;
	/** the upper value of X range */
	private double xUpperValue;
	/** the lower value of Y range */
	private double yLowerValue;
	/** the upper value of Y range */
	private double yUpperValue;
	/** the state indicating whether the X axis is log scale */
	private boolean xLogScale;
	/** the state indicating whether the Y axis is log scale */
	private boolean yLogScale;

	/**
	 * Constructor.
	 */
	public CompressConfig() {
		widthInPixels = 1024;
		heightInPixels = 512;
		xLogScale = false;
		yLogScale = false;
	}

	/**
	 * Constructor.
	 * 
	 * @param config
	 *            the configuration for compression
	 */
	public CompressConfig(CompressConfig config) {
		widthInPixels = config.getWidthInPixel();
		heightInPixels = config.getHeightInPixel();
		xLowerValue = config.getXLowerValue();
		xUpperValue = config.getXUpperValue();
		yLowerValue = config.getYLowerValue();
		yUpperValue = config.getYUpperValue();
		xLogScale = config.isXLogScale();
		yLogScale = config.isYLogScale();
	}

	@Override
	public boolean equals(Object obj) {

		if(obj == null || !(obj instanceof CompressConfig)) {
			return false;
		}
		CompressConfig config = (CompressConfig)obj;
		if(widthInPixels != config.getWidthInPixel() || heightInPixels != config.getHeightInPixel()) {
			return false;
		}
		double diff = Math.abs(xLowerValue - config.getXLowerValue()) / (xUpperValue - xLowerValue);
		if(diff > 1.0 / widthInPixels) {
			return false;
		}
		diff = Math.abs(xUpperValue - config.getXUpperValue()) / (xUpperValue - xLowerValue);
		if(diff > 1.0 / widthInPixels) {
			return false;
		}
		diff = Math.abs(yLowerValue - config.getYLowerValue()) / (yUpperValue - yLowerValue);
		if(diff > 1.0 / heightInPixels) {
			return false;
		}
		diff = Math.abs(yUpperValue - config.getYUpperValue()) / (yUpperValue - yLowerValue);
		if(diff > 1.0 / heightInPixels) {
			return false;
		}
		if(config.isXLogScale() != xLogScale) {
			return false;
		}
		if(config.isYLogScale() != yLogScale) {
			return false;
		}
		return true;
	}

	@Override
	public int hashCode() {

		return 0;
	}

	/**
	 * Sets the size in pixels.
	 * 
	 * @param width
	 *            the width in pixels
	 * @param height
	 *            the height in pixels
	 */
	public void setSizeInPixel(long width, long height) {

		widthInPixels = width;
		heightInPixels = height;
	}

	/**
	 * Gets the width of plot area in pixels
	 * 
	 * @return the width of plot area in pixels
	 */
	public long getWidthInPixel() {

		return widthInPixels;
	}

	/**
	 * Gets the height of plot area in pixels
	 * 
	 * @return the height of plot area in pixels
	 */
	public long getHeightInPixel() {

		return heightInPixels;
	}

	/**
	 * Sets the X range.
	 * 
	 * @param lower
	 *            the lower value of x range
	 * @param upper
	 *            the upper value of x range
	 */
	public void setXRange(double lower, double upper) {

		xLowerValue = lower;
		xUpperValue = upper;
	}

	/**
	 * Sets the Y range.
	 * 
	 * @param lower
	 *            the lower value of y range
	 * @param upper
	 *            the upper value of y range
	 */
	public void setYRange(double lower, double upper) {

		yLowerValue = lower;
		yUpperValue = upper;
	}

	/**
	 * Gets the lower value of x range.
	 * 
	 * @return the lower value of x range
	 */
	public double getXLowerValue() {

		return xLowerValue;
	}

	/**
	 * Gets the upper value of x range.
	 * 
	 * @return the upper value of x range
	 */
	public double getXUpperValue() {

		return xUpperValue;
	}

	/**
	 * Gets the lower value of y range.
	 * 
	 * @return the lower value of y range
	 */
	public double getYLowerValue() {

		return yLowerValue;
	}

	/**
	 * Gets the upper value of y range.
	 * 
	 * @return the upper value of y range
	 */
	public double getYUpperValue() {

		return yUpperValue;
	}

	/**
	 * Gets the state indicating whether the X axis is log scale.
	 * 
	 * @return true if the X axis is log scale
	 */
	public boolean isXLogScale() {

		return xLogScale;
	}

	/**
	 * Sets the state indicating whether the X axis is log scale.
	 * 
	 * @param value
	 *            the state indicating whether the X axis is log scale
	 */
	public void setXLogScale(boolean value) {

		this.xLogScale = value;
	}

	/**
	 * Gets the state indicating whether the Y axis is log scale.
	 * 
	 * @return true if the Y axis is log scale
	 */
	public boolean isYLogScale() {

		return yLogScale;
	}

	/**
	 * Sets the state indicating whether the Y axis is log scale.
	 * 
	 * @param value
	 *            the state indicating whether the Y axis is log scale
	 */
	public void setYLogScale(boolean value) {

		this.yLogScale = value;
	}

	@Override
	public String toString() {

		return "pixelWidth = " + widthInPixels + ", " + "pixelHeight = " + heightInPixels + ", " + "xLowerValue = " + xLowerValue + ", " + "xUpperValue = " + xUpperValue + ", " + "yLowerValue = " + yLowerValue + ", " + "yUpperValue = " + yUpperValue + ", " + yLogScale; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ //$NON-NLS-11$ //$NON-NLS-12$
	}
}
