/*******************************************************************************
 * Copyright (C) 2010, Matthias Sohn <matthias.sohn@sap.com>
 * Copyright (C) 2010, Stefan Lay <stefan.lay@sap.com>
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *******************************************************************************/
package org.eclipse.example.calc.internal;

import org.eclipse.example.calc.BinaryOperation;
import org.eclipse.example.calc.Operation;
import org.eclipse.example.calc.Operations;
import org.eclipse.example.calc.UnaryOperation;
import org.eclipse.example.calc.internal.operations.Equals;
import org.eclipse.example.calc.internal.operations.Minus;
import org.eclipse.example.calc.internal.operations.Plus;
import org.eclipse.example.calc.internal.operations.Square;

public class Calculator {

	private TextProvider textProvider;

	private String cmd;

	private boolean clearText;

	private float value;

	public static String NAME = "Simple Calculator";

	public Calculator(TextProvider textProvider) {
		this.textProvider = textProvider;
		setupDefaultOperations();
	}

	private void setupDefaultOperations() {
		new Equals();
		new Minus();
		new Plus();
		new Square();
	}

	private void calculate(String cmdName) {
		float curValue;
		float newValue = 0;

		// get current value of display
		curValue = Float.parseFloat(textProvider.getDisplayText());

		Operation currentOp = Operations.INSTANCE.getOperation(cmdName);
		if ((currentOp instanceof BinaryOperation) && (cmd == null)) {
			// if last clicked operation was binary and there is no saved
			// operation, store it
			cmd = cmdName;
			setClearText(true);
		} else {
			// if saved command is binary perform it
			Operation savedOp = Operations.INSTANCE.getOperation(cmd);
			if (savedOp instanceof BinaryOperation) {
				BinaryOperation bop = (BinaryOperation) savedOp;
				newValue = bop.perform(value, curValue);
			} // if current operation is unary perform it
			else if (currentOp instanceof UnaryOperation) {
				UnaryOperation uop = (UnaryOperation) currentOp;
				newValue = uop.perform(curValue);
			}

			// display the result and prepare clear on next button
			textProvider.setDisplayText("" + newValue);
			setClearText(true);
			if (currentOp instanceof Equals) {
				// do not save "=" command
				cmd = null;
			} else if (currentOp instanceof BinaryOperation) {
				// save binary commands as they are executed on next operation
				cmd = cmdName;
			} else {
				// clear saved command
				cmd = null;
			}
		}

	}

	private boolean isCommand(String name) {
		return (Operations.INSTANCE.getOperation(name) != null);
	}

	public void handleButtonClick(String str) {
		if (isCommand(str)) {
			calculate(str);
		} else {
			char digit = (str.toCharArray())[0];
			if (Character.isDigit(digit) || digit == '.') {
				if (clearText) {
					// save current value and clear the display
					value = Float.parseFloat(textProvider.getDisplayText());
					textProvider.setDisplayText("");
					setClearText(false);
				}

				// add new digit to display
				textProvider.setDisplayText(textProvider.getDisplayText() + digit);
			}
		}
	}

	public void setClearText(boolean clearText) {
		this.clearText = clearText;
	}
}
