package com.infoteria.asteria.flowlibrary2.mapper.string;

import com.infoteria.asteria.flowengine2.execute.ExecuteContext;
import com.infoteria.asteria.flowengine2.resource.ExecuteInfo;
import com.infoteria.asteria.flowlibrary2.mapper.MultiOutputFunction;
import com.infoteria.asteria.flowlibrary2.mapper.MapperException;
import com.infoteria.asteria.value.Value;

public class Split extends MultiOutputFunction {
	
	private static final String FUNCTION_NAME = "Split";
	private static final String PROPERTY_SEPARATOR = "Separator";
	private static final String PROPERTY_SEARCH_DIR = "SearchDir";
	private static final String PROPERTY_SEP_MODE = "SeparatorMode";
	
	private static final String VALUE_LEFT  = "Left";
	private static final String VALUE_RIGHT = "Right";
	private static final String VALUE_NONE  = "None";
	
	public String getFunctionName() { return FUNCTION_NAME;}
	
	public Split() {
		setSubValueCount(1);
	}
	
	protected void internalInit() {
		registProperty(PROPERTY_SEPARATOR, Value.TYPE_STRING, false);
		registProperty(PROPERTY_SEARCH_DIR, Value.TYPE_STRING, true);
		registProperty(PROPERTY_SEP_MODE, Value.TYPE_STRING, true);
	}
	
	public int getMinInputCount() { return 1;}
	public int getMaxInputCount() { return 2;}
	
	public void execute(ExecuteContext context, Value[] in, Value out) throws MapperException {
		String s = in[0].toString();
		String searchStr = getPropertyString(PROPERTY_SEPARATOR, in, 1);
		if (searchStr == null || searchStr.length() == 0)
			throw new MapperException(ExecuteInfo.INVALID_PROPERTY_VALUE, PROPERTY_SEPARATOR, searchStr);
		String searchDirStr = getPropertyString(PROPERTY_SEARCH_DIR);
		int searchDir = 0;
		if (searchDirStr.equals(VALUE_RIGHT))
			searchDir = 1;
		
		String sepModeStr = getPropertyString(PROPERTY_SEP_MODE);
		int sepMode = 0;
		if (VALUE_LEFT.equals(sepModeStr))
			sepMode = 1;
		else if (VALUE_RIGHT.equals(sepModeStr))
			sepMode = 2;
		
		int index = 0;
		if (searchDir == 0)
			index = s.indexOf(searchStr);
		else
			index = s.lastIndexOf(searchStr);
		
		if (index < 0) {
			out.setValue(s);
			getSubValue(0).setValue("");
		} else {
			String s1 = null;
			String s2 = null;
			switch (sepMode) {
				case 0:
					s1 = s.substring(0, index);
					s2 = s.substring(index + searchStr.length());
					break;
				case 1:
					index += searchStr.length();
					s1 = s.substring(0, index);
					s2 = s.substring(index);
					break;
				case 2:
					s1 = s.substring(0, index);
					s2 = s.substring(index);
					break;
			}
			out.setValue(s1);
			getSubValue(0).setValue(s2);
		}
	}
	
}
