package org.eclipse.cdt.debug.edc.tests.tcfagent;

import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;

import org.eclipse.cdt.debug.edc.tcf.extension.services.AbstractTCFService;
import org.eclipse.cdt.debug.edc.tcf.extension.services.ISettings;
import org.eclipse.tm.tcf.protocol.IChannel;
import org.eclipse.tm.tcf.protocol.IChannel.ICommandServer;
import org.eclipse.tm.tcf.protocol.IService;
import org.eclipse.tm.tcf.protocol.IToken;
import org.eclipse.tm.tcf.protocol.JSON;

public class SettingsService extends AbstractTCFService {

	private final HashMap<String, Object> settingsValues = new HashMap<String, Object>();
	public static final String[] supportedSettings = {
			"TestSetting_1",
			"TestSetting_2",
	};

	public class CommandServer extends AbstractCommandServer {

		public void getIds(IToken token, String name, Object[] args) throws IOException {
			getChannel().sendResult(token, JSON.toJSONSequence(new Object[] { null,
					supportedSettings }));
		}

		public void set(IToken token, String name, Object[] args) throws IOException {
			@SuppressWarnings("unchecked")
			Collection<Object>
			  ids = (Collection<Object>) args[1],
			  values = (Collection<Object>) args[2];
			handleSetValues(token, (String) args[0], ids.toArray(new String[ids.size()]), values.toArray());
		}

		private void handleSetValues(IToken token, String context, String[] ids, Object[] values) throws IOException {
			if (ids.length != values.length) {
				throw new IOException("ids[] != values[] length");
			}

			for (int i = 0; i < ids.length; i++) {
				settingsValues.put(ids[i], values[i]);
			}
			
			getChannel().sendResult(token, JSON.toJSONSequence(new Object[] { null }));
		}
	}

	public SettingsService(IChannel channel) {
		super(channel);
	}

	public String getName() {
		return ISettings.NAME;
	}

	public Object getSettingValue(String id) {
		return settingsValues.get(id);
	}

	@Override
	protected ICommandServer getCommandServer() {
		return new CommandServer();
	}
}
