package simulator.states;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import models.algebra.Constant;
import models.algebra.Expression;
import models.algebra.Term;
import models.dataConstraintModel.DataConstraintModel;
import models.dataConstraintModel.ListTerm;

public class ListResourceState extends CompositeResourceState {
	private List<ResourceState> children = new ArrayList<>();
	
	@Override
	public Expression getValue() {
		ListTerm value = new ListTerm();
		for (ResourceState child: children) {
			value.append(child.getValue());
		}
		return value;
	}
	
	@Override
	public Map<String, ResourceState> getChildStates() {
		Map<String, ResourceState> childParams = new TreeMap<>();
		for (int i = 0; i < children.size(); i++) {
			childParams.put(Integer.toString(i), children.get(i));
		}
		return childParams;
	}

	public void addChildState(ResourceState childState) {
		children.add(childState);
	}


	@Override
	public void replaceChildState(ResourceState state, ResourceState newState) {
		for (int i = 0; i < children.size(); i++) {
			if (children.get(i).equals(state)) {
				children.set(i, newState);
			}
		}
	}
	
	public Object clone() {
		ListResourceState newListResourceState = new ListResourceState();
		for (ResourceState state: children) {
			newListResourceState.children.add((ResourceState) state.clone());
		}
		return newListResourceState;
	}
}
