/**
 *
 */
package com.github.jmkgreen.morphia.converters;

import com.github.jmkgreen.morphia.mapping.MappedField;
import com.github.jmkgreen.morphia.mapping.MappingException;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;

/**
 * @author Uwe Schaefer, (us@thomas-daily.de)
 * @author scotthernandez
 */
@SuppressWarnings({"unchecked", "rawtypes"})
public class EnumSetConverter extends TypeConverter implements SimpleValueConverter {

    private EnumConverter ec = new EnumConverter();

    public EnumSetConverter() {
        super(EnumSet.class);
    }

    @Override
    public Object decode(Class targetClass, Object fromDBObject, MappedField optionalExtraInfo) throws MappingException {
        if (fromDBObject == null)
            return null;

        Class enumType = optionalExtraInfo.getSubClass();

        List l = (List) fromDBObject;
        if (l.isEmpty())
            return EnumSet.noneOf(enumType);

        ArrayList enums = new ArrayList();
        for (Object object : l) {
            enums.add(ec.decode(enumType, object));
        }
        EnumSet copyOf = EnumSet.copyOf(enums);
        return copyOf;
    }

    @Override
    public Object encode(Object value, MappedField optionalExtraInfo) {
        if (value == null)
            return null;

        ArrayList values = new ArrayList();

        EnumSet s = (EnumSet) value;
        Object[] array = s.toArray();
        for (int i = 0; i < array.length; i++) {
            values.add(ec.encode(array[i]));
        }

        return values;
    }
}
