package rpn.basic;

import java.util.Hashtable;
import rpn.Calculator;

public class RParenItem extends Item {

	public RParenItem(Calculator ca) {
		super(ca);
		ca.systemInstall(this);
	}
	
	public void exec() {
		if (ca.check(3)) {
			Item a = ca.peek(2);
			Item b = ca.peek(1);
			Item c = ca.peek(0);
			/* System.out.println("a = " + a);
			System.out.println("b = " + b);
			System.out.println("c = " + c); */
			if (b instanceof LParenItem
				&& c instanceof IntValue) {
				if (a instanceof ArrayItem) { 
					int n = ((IntValue) c).intValue();
					ArrayItem A = (ArrayItem) a;
					if (0 <= n && n < A.size()) {
						Item it = A.get(n);
						ca.pop(3);
						ca.push(it);
					} else {
						ca.error(this, CalcErr.Range);
					}
				} else if (a instanceof PointerItem) {
					Item x = ((PointerItem) a).getItem();
					if (x != null && x instanceof ArrayItem) {
						int i = ((IntValue) c).intValue();
						Item it = new IndexItem(ca, (ArrayItem) x, i);
						ca.pop(3);
						ca.push(it);
					}
				} else {
					// System.out.println("Type 1");
					ca.error(this, CalcErr.Type);
				}
			} else {
				// System.out.println("Type 2");
				ca.error(this, CalcErr.Type);
			}
		} else {
			ca.error(this, CalcErr.Underflow);
		}
	}
	
	public String toString() {
		return(")");
	}
}
