package dockerx.spring.boot.rxjava.config;

import dockerx.spring.boot.rxjava.valuehandler.ObservableReturnValueHandler;
import dockerx.spring.boot.rxjava.valuehandler.SingleReturnValueHandler;
import io.reactivex.Observable;
import io.reactivex.Single;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.AsyncHandlerMethodReturnValueHandler;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;


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

/**
 * @author Author  知秋
 * @email [email protected]
 * @time Created by Auser on 2018/3/27 21:33.
 */
@Configuration
@ConditionalOnProperty(value = "rxjava.mvc.enabled", matchIfMissing = true)
public class RxJavaMvcAutoConfiguration {
    @Bean
    @RxMVC
    @ConditionalOnMissingBean
    @ConditionalOnClass(Observable.class)
    public ObservableReturnValueHandler observableReturnValueHandler() {
        return new ObservableReturnValueHandler();
    }

    @Bean
    @RxMVC
    @ConditionalOnMissingBean
    @ConditionalOnClass(Single.class)
    public SingleReturnValueHandler singleReturnValueHandler() {
        return new SingleReturnValueHandler();
    }

    @Configuration
    public static class RxJavaWebConfiguration {

        @RxMVC
        @Autowired
        private List<AsyncHandlerMethodReturnValueHandler> handlers = new ArrayList<>();

        @Bean
        public WebMvcConfigurationSupport rxJavaWebMvcConfiguration() {
            return new WebMvcConfigurationSupport(){
                @Override
                protected void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
                    super.addReturnValueHandlers(returnValueHandlers);
                    returnValueHandlers.addAll(handlers);
                }
            };
        }
    }
}