package org.springblade.common.utils;

import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;
import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Method;
import java.util.function.Function;

/**
 * @Author: Silent
 * @Description
 * @Date: Created in 15:58 2021/11/4
 * @Modified By:
 */
public interface BeanPropertyUtil<T, R> extends Function<T, R>, Serializable {

	/**
	 * 获取字段
	 * @param func
	 * @param <T>
	 * @return
	 */
	static <T,R> String getFieldName(BeanPropertyUtil<T, R> func) {
		try {
			// 通过获取对象方法，判断是否存在该方法
			Method method = func.getClass().getDeclaredMethod("writeReplace");
			method.setAccessible(Boolean.TRUE);
			// 利用jdk的SerializedLambda 解析方法引用
			java.lang.invoke.SerializedLambda serializedLambda = (SerializedLambda) method.invoke(func);
			String getter = serializedLambda.getImplMethodName();
			return resolveFieldName(getter);
		} catch (ReflectiveOperationException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 解析字段名
	 * @param getMethodName
	 * @return
	 */
	static String resolveFieldName(String getMethodName) {
		if (getMethodName.startsWith("get")) {
			getMethodName = getMethodName.substring(3);
		} else if (getMethodName.startsWith("is")) {
			getMethodName = getMethodName.substring(2);
		}
		// 小写第一个字母
		return firstToLowerCase(getMethodName);
	}

	/**
	 * 小写转化
	 * @param param
	 * @return
	 */
	static String firstToLowerCase(String param) {
		if (StringUtils.isBlank(param)) {
			return "";
		}
		return param.substring(0, 1).toLowerCase() + param.substring(1);
	}
}
