package cn.timer.api.config.interceptor;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;

@Configuration
public class WebSecurityConfig implements WebMvcConfigurer {
	
	@Resource
	private UserMethodArgumentResolver userMethodArgumentResolver;
	
	@Bean
	public RedisSessionInterceptor getSessionInterceptor() {
		return new RedisSessionInterceptor();
	}

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// 所有已api开头的访问都要进入RedisSessionInterceptor拦截器进行登录验证,并排除login接口(全路径)。必须写成链式,分别设置的话会创建多个拦截器。
		// 必须写成getSessionInterceptor(),否则SessionInterceptor中的@Autowired会无效
		//.excludePathPatterns("/")
		registry.addInterceptor(getSessionInterceptor())
				.addPathPatterns("/**")
				.excludePathPatterns("/callback/**")
				.excludePathPatterns("/actuator/*")
				.excludePathPatterns("/doc*")
				.excludePathPatterns("/v2/**")
				.excludePathPatterns("/**/*.js")
				.excludePathPatterns("/8timer/**")
				.excludePathPatterns("/kqdk/punchclock/**")
				.excludePathPatterns("/kqz/sauserregdata/**")
				.excludePathPatterns("/login/**")
				.excludePathPatterns("/swagger*/**")
				.excludePathPatterns("/v2/api-docs")
				.excludePathPatterns("/druid/login*")
				.excludePathPatterns("/app/**")
				.excludePathPatterns("/webjars/**");
		// registry.addInterceptor(getSessionInterceptor()).addPathPatterns("/**").excludePathPatterns("/swagger-ui*");
	}
	
	/**
     * 配置消息转换器--这里我用的是alibaba 开源的 fastjson
     * @param converters
     */
	@Override
	public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
		
//		Iterator<HttpMessageConverter<?>> iterator = converters.iterator();
//	    while(iterator.hasNext()){
//	        HttpMessageConverter<?> converter = iterator.next();
//	        if(converter instanceof MappingJackson2HttpMessageConverter){
//	            iterator.remove();
//	        }
//	    }

	    // 1.需要先定义一个convert 转换消息的对象
	    FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
	    // 2.添加fastJson的配置信息,比如,是否需要格式化返回的json数据
	    FastJsonConfig fastJsonConfig = new FastJsonConfig();
	    // 时间格式化
	    fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
	    // fastJsonConfig.setDateFormat("yyyy-MM-dd");
	    // 空值特别处理
	    // WriteNullListAsEmpty 将Collection类型字段的字段空值输出为[]
	    // WriteNullStringAsEmpty 将字符串类型字段的空值输出为空字符串 ""
	    // WriteNullNumberAsZero 将数值类型字段的空值输出为0
	    // WriteNullBooleanAsFalse 将Boolean类型字段的空值输出为false
	    fastJsonConfig.setSerializerFeatures(
	    		SerializerFeature.PrettyFormat
//		        SerializerFeature.WriteEnumUsingToString,
//		        SerializerFeature.WriteNullStringAsEmpty,
//		        SerializerFeature.WriteMapNullValue,
//		        SerializerFeature.WriteDateUseDateFormat
		        );
//		fastJsonConfig.setSerializeFilters((ValueFilter) (o, s, source) -> {
//		    if (source == null) {
//		        return "";//此处是关键,如果返回对象的变量为null,则自动变成""
//		    }
//		    if (source instanceof Date) {
//		        return ((Date) source).getTime();
//		    }
//		    return source;
//		});
	    // 处理中文乱码问题
	    List<MediaType> fastMediaTypes = new ArrayList<>();
	    fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
	    fastConverter.setSupportedMediaTypes(fastMediaTypes);
	    // 3.在convert中添加配置信息
	    fastConverter.setFastJsonConfig(fastJsonConfig);
	    // 4.将convert添加到converters当中
	    converters.add(0,fastConverter);

	}
	
	@Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(userMethodArgumentResolver);
    }
	
//	@Override
//    public void addCorsMappings(CorsRegistry registry) {
////        System.out.println("我是MyWebConfig跨域");
//        //设置允许跨域的路径
//        registry.addMapping("/**")
//                //设置允许跨域请求的域名
//                .allowedOrigins("*")
//                //是否允许证书 不再默认开启
//                .allowCredentials(true)
//                //设置允许的方法
//                .allowedMethods("*")
//                //跨域允许时间
//                .maxAge(3600);
//    }
}