package cn.timer.api.aspect;

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

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.ObjectError;

import com.alibaba.fastjson.JSONObject;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.ClassUtil;
import cn.timer.api.aspect.lang.annotation.BindingResultCtrol;
import cn.timer.api.aspect.lang.bean.ValidationError;
import cn.timer.api.utils.ResultUtil;

/**
 * 校验信息返回-(闲置)
 * 
 * @author TZQ
 */
//@Aspect
//@Component
public class BindingResultAspect {

// 	  @annotation配置织入点
//    @Pointcut("@annotation(cn.timer.api.aspect.lang.annotation.BindingResultCtrol)")
//    public void bindingResultPointCut()
//    {
//    }
    
    // execution 配置织入点 -匹配 cn.timer.api.controller 包下的所有子包的类的方法
//    @Pointcut("execution(* cn.timer.api.controller.spmk.*.*(..))")
    public void clazzPointCut(){
    }
    
//
//    @Before("bindingResultPointCut()")
//    public void doBefore(JoinPoint point) throws Throwable
//    {
//    	//预留
//        handleDataScope(point);
//    }
    
//    @Around("bindingResultPointCut() && args(..,bindingResult)")
//    @Around("clazzPointCut()")
//    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
//        Long startTime = System.currentTimeMillis();
//        Object retVal;
//        Object[] objs = joinPoint.getArgs();
//        List<Object> listObj = CollectionUtil.toList(objs);
//        BeanPropertyBindingResult optional = (BeanPropertyBindingResult)listObj.stream()
//	        .filter(p -> "BeanPropertyBindingResult".equals(ClassUtil.getClassName(p, true)))
//	        .findFirst()
//	        .orElse(null);
//        if(optional != null && optional.hasErrors()){
//            List<ObjectError> ls = optional.getAllErrors();
//            List<ValidationError> listVe = new ArrayList<ValidationError>();
//            ValidationError ve;
//            for (ObjectError one : ls) {
//            	
//            	String fieldString = one.getCodes().length >= 1 ? one.getCodes()[0] : "";
//            	if (fieldString != null) {
//            		fieldString = fieldString.substring(fieldString.lastIndexOf(".") + 1);
//				}
//            	
//            	ve = ValidationError.builder().field(fieldString).msg(one.getDefaultMessage()).build();
//            	listVe.add(ve);
//            	
//            }
//            retVal = ResultUtil.error(listVe);
//        }else {
//            retVal = joinPoint.proceed(joinPoint.getArgs());
//        }
//        Console.log("返回内容 {}: " ,JSONObject.toJSONString(retVal));
//        Long endtime = System.currentTimeMillis();
//        Console.log("执行耗时为{}:" ,endtime-startTime + "ms");
//
//        return retVal;
//    }

    protected void handleDataScope(final JoinPoint joinPoint)
    {
        // 获得注解
    	BindingResultCtrol controllerDataScope = getAnnotationLog(joinPoint);
        if (controllerDataScope == null)
            return;
        Console.log("title" + controllerDataScope.title());
        Console.log("paramType" + controllerDataScope.paramType());
        Object[] objs = joinPoint.getArgs();
        
        List<Object> listObj = CollectionUtil.toList(objs);
        BeanPropertyBindingResult optional = (BeanPropertyBindingResult)listObj.stream()
	        .filter(p -> "BeanPropertyBindingResult".equals(ClassUtil.getClassName(p, true)))
	        .findFirst()
	        .orElse(null);
        if (optional != null && optional.hasErrors()) {
        	System.err.println("Optional: "+ optional);
		}
        
        
    }

    /**
     * 是否存在注解,如果存在就获取
     */
    private BindingResultCtrol getAnnotationLog(JoinPoint joinPoint)
    {
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();

        if (method != null)
        {
            return method.getAnnotation(BindingResultCtrol.class);
        }
        return null;
    }
	
	
}