package com.rehome.mqttclienttemperature.webservice;

import javax.annotation.Resource;
import javax.xml.ws.Endpoint;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * WebService 配置类
 * @author HuangWenfei
 * @version 1.0
 * @date 2025/04/15 14:21
 */
@Configuration
public class WebServiceConfig {
    private static final Logger log = LoggerFactory.getLogger(WebServiceConfig.class);
    /**
     * 注入 CXF servlet bean
     * 1、bean 名称不能叫 dispatcherServlet，否则会覆盖MVC原本的 dispatcherServlet。
     * 2、指定 webservice 服务访问的路径。所有的服务接口都会在路径下。
     *
     * @return
     */
    @Bean(name = "cxfServlet")
    public ServletRegistrationBean<CXFServlet> cxfServlet() {
        // 注册servlet 拦截 /webservice 开头的请求，不设置时默认为 /services/*
        return new ServletRegistrationBean<>(new CXFServlet(), "/webservice/*");
    }

    /**
     * 业务处理类，也可以直接在实现类上标注 @Service 注解。
     * @return
     */
//    @Bean
//    public AgencyService agencyService() {
//        return new AgencyServiceImpl();
//    }
//    @Bean(name = Bus.DEFAULT_BUS_ID)
//    public SpringBus springBus() {
//        return new SpringBus();
//    }

    @Resource
    private AgencyService agencyService;
    @Resource
    @Qualifier(Bus.DEFAULT_BUS_ID)
    private SpringBus springBus;



    /**
     * 发布 Web 服务访问端点
     * 1、本方法可以提供多个，用于发布多个访问断点。
     * 2、publish 方法用于开始发布端点，此时端点开始接受传入请求。
     * 3、stop 方法可以用于停止接受传入请求并关闭端点。一旦停止，就无法再次发布终结点。
     * @return  http://127.0.0.1:8088/ws/ApiCommonService?wsdl
     */
    @Bean
    public Endpoint agencyServiceEndpoint() {
        // 参数二是SEI实现类对象
        EndpointImpl endpoint = new EndpointImpl(this.springBus, agencyService);
        // 发布服务
        //endpoint.publish("/agencyService");
        String simpleName = agencyService.getClass().getSimpleName();
        log.info("simpleName：{}",simpleName);
        //如果有Impl结尾的类名，去掉Impl
        if (simpleName.endsWith("Impl")) {
            simpleName = simpleName.substring(0, simpleName.length() - 4);
        }
        log.info("simpleName：{}",simpleName);
        endpoint.publish("/"+simpleName);
        return endpoint;
    }

}