// 
// Decompiled by Procyon v0.6.0
// 

package org.bson.codecs.pojo;

import java.lang.reflect.Modifier;
import java.util.List;
import java.util.Collection;
import java.util.ArrayList;
import java.lang.reflect.Method;

final class PropertyReflectionUtils
{
    private static final String IS_PREFIX = "is";
    private static final String GET_PREFIX = "get";
    private static final String SET_PREFIX = "set";
    
    private PropertyReflectionUtils() {
    }
    
    static boolean isGetter(final Method method) {
        if (method.getParameterTypes().length > 0) {
            return false;
        }
        if (method.getName().startsWith("get") && method.getName().length() > "get".length()) {
            return Character.isUpperCase(method.getName().charAt("get".length()));
        }
        return method.getName().startsWith("is") && method.getName().length() > "is".length() && Character.isUpperCase(method.getName().charAt("is".length()));
    }
    
    static boolean isSetter(final Method method) {
        return method.getName().startsWith("set") && method.getName().length() > "set".length() && method.getParameterTypes().length == 1 && Character.isUpperCase(method.getName().charAt("set".length()));
    }
    
    static String toPropertyName(final Method method) {
        final String name = method.getName();
        final String propertyName = name.substring(name.startsWith("is") ? 2 : 3, name.length());
        final char[] chars = propertyName.toCharArray();
        chars[0] = Character.toLowerCase(chars[0]);
        return new String(chars);
    }
    
    static PropertyMethods getPropertyMethods(final Class<?> clazz) {
        final List<Method> setters = new ArrayList<Method>();
        final List<Method> getters = new ArrayList<Method>();
        for (final Class<?> i : clazz.getInterfaces()) {
            for (final Method method : i.getDeclaredMethods()) {
                if (method.isDefault()) {
                    verifyAddMethodToList(method, getters, setters);
                }
            }
        }
        for (final Method method2 : clazz.getDeclaredMethods()) {
            verifyAddMethodToList(method2, getters, setters);
        }
        return new PropertyMethods(getters, setters);
    }
    
    private static void verifyAddMethodToList(final Method method, final List<Method> getters, final List<Method> setters) {
        if (Modifier.isPublic(method.getModifiers()) && !method.isBridge()) {
            if (isGetter(method)) {
                getters.add(method);
            }
            else if (isSetter(method)) {
                setters.add(method);
            }
        }
    }
    
    static class PropertyMethods
    {
        private final Collection<Method> getterMethods;
        private final Collection<Method> setterMethods;
        
        PropertyMethods(final Collection<Method> getterMethods, final Collection<Method> setterMethods) {
            this.getterMethods = getterMethods;
            this.setterMethods = setterMethods;
        }
        
        Collection<Method> getGetterMethods() {
            return this.getterMethods;
        }
        
        Collection<Method> getSetterMethods() {
            return this.setterMethods;
        }
    }
}
