/**
 * 
 */
package org.richfaces.convert.selection;

import java.util.Iterator;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.richfaces.model.selection.ClientSelection;
import org.richfaces.model.selection.SelectionRange;

/**
 * @author Maksim Kaszynski
 *
 */
public class ClientSelectionConverter implements Converter {

	public static final String CONVERTER_ID = 
		ClientSelectionConverter.class.getName();
	
	private static final Log log = 
		LogFactory.getLog(ClientSelectionConverter.class);
	
	public Object getAsObject(FacesContext context, UIComponent component, String value) {
		return getAsSelection(context, component, value == null ? "" : value);
	}

	public String getAsString(FacesContext context, UIComponent component, Object value) {
		
		if (log.isDebugEnabled()) {
			log.debug("Converting to string " + value);
		}
		
		StringBuffer buffer = new StringBuffer();
		Iterator iterator = ((ClientSelection) value).getRanges().iterator();
		
		while(iterator.hasNext()) {
			
			SelectionRange selectionRange = 
				(SelectionRange) iterator.next();
			
			buffer
				.append(selectionRange.getStartIndex())
				.append(",")
				.append(selectionRange.getEndIndex())
				.append(";");
		}
		
		return buffer.toString();
	}
	
	private ClientSelection getAsSelection(FacesContext context, UIComponent grid, String stringSelection) {
		
		if (log.isDebugEnabled()) {
			log.debug("parsing " + stringSelection);
		}
		
		final ClientSelection clientSelection = new ClientSelection();
		if(stringSelection == null || stringSelection.length() == 0) {
			return clientSelection;
		}
		
		String [] selections = stringSelection.split(";");
		int length = selections.length;
		if (selections[length-1].charAt(0) > '9') {
			clientSelection.setSelectionFlag(selections[length-1]);
			length--;
		}
		clientSelection.setActiveRowIndex(Integer.parseInt(selections[length-1]));
		length--;
		for (int i = 0; i < length; i++) {
			
			String range = selections[i];
			
			if (range.length() != 0) {
				String [] rng = range.split(",");
				
				try {
					int fi = Integer.parseInt(rng[0]);
					int il = Integer.parseInt(rng[1]);
					
					if (log.isDebugEnabled()) {
						log.debug("Parsed range " + fi + " " + il);
					}
					
					clientSelection.addRange(new SelectionRange(fi, il));
					
				} catch (NumberFormatException e) {
					throw new ConverterException(e);
				}
			}
		}

		return clientSelection;
	}

}
