package com.cardshifter.gdx;

import com.badlogic.gdx.utils.reflect.ClassReflection;
import com.badlogic.gdx.utils.reflect.Field;
import com.cardshifter.api.ArrayUtil;
import com.cardshifter.api.serial.ReflField;
import com.cardshifter.api.serial.ReflectionInterface;

import java.util.*;

/**
 * Created by Simon on 4/25/2015.
 */
public class GdxReflection implements ReflectionInterface {

    private final Set<String> fieldNameSkip = new HashSet<String>(
            Arrays.asList("___clazz", "castableTypeMap", "expando", "typeMarker")
    );

    @Override
    public Object create(Class<?> aClass) throws Exception {
        return ClassReflection.newInstance(aClass);
    }

    @Override
    public ReflField[] getFields(Class<?> aClass) {
        Field[] fields = ClassReflection.getDeclaredFields(aClass);
        List<ReflField> result = new ArrayList<ReflField>(fields.length);
        for (Field field : fields) {
            String name = field.getName();
            if (fieldNameSkip.contains(name)) {
                continue;
            }
            result.add(new GdxField(field));
        }
        return result.toArray(new ReflField[result.size()]);
    }

    @Override
    public boolean isEnum(Class<?> aClass) {
        return ClassReflection.isAssignableFrom(Enum.class, aClass);
    }

    @Override
    public Class<?> forName(String s) throws Exception {
        return ClassReflection.forName(s);
    }


}