package com.bb.config;

import org.apache.hc.client5.http.classic.HttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {
    
    @Bean
    public HttpClient httpClient() {
        // HttpClient 5에서는 PoolingHttpClientConnectionManager를 사용하여 커넥션 풀을 관리합니다.
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        connectionManager.setMaxTotal(4096);      // 최대 오픈되는 커넥션 수
        connectionManager.setDefaultMaxPerRoute(200); // IP, 포트 1쌍에 대해 수행할 커넥션 수

        return HttpClientBuilder.create()
            .setConnectionManager(connectionManager)
            .build();
    }

    @Bean
    public HttpComponentsClientHttpRequestFactory factory(HttpClient httpClient) {
        // HttpClient 5를 사용하는 팩토리 생성
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
        
        // Spring Boot 3/HttpClient 5에서는 타임아웃 설정을 팩토리에서 직접 관리하거나 
        // 필요한 경우 빌더 단계에서 설정합니다.
        factory.setConnectTimeout(3000); // 연결시간초과, ms
        // 주의: v5용 팩토리에서 setReadTimeout은 지원되지 않을 수 있으므로, 
        // 런타임 에러 시 빌더의 RequestConfig 설정을 사용해야 합니다.
        return factory;
    }
    
    @Bean
    public RestTemplate restTemplate(HttpComponentsClientHttpRequestFactory factory) {
        return new RestTemplate(factory);
    }
}