package incheon.product.common.geo3d;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.web.client.RestTemplate;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.*;

/**
 * ExternalApiClient 단위 테스트.
 * @PostConstruct 초기화 검증 및 RestTemplate 위임 로직을 테스트한다.
 */
class ExternalApiClientTest {

    private ExternalApiClient client;

    @BeforeEach
    void setup() {
        client = new ExternalApiClient();
    }

    @Test
    void initCreatesRestTemplates() {
        GeoView3DProperties props = new GeoView3DProperties();
        ReflectionTestUtils.setField(client, "properties", props);

        client.init();

        assertThat(ReflectionTestUtils.getField(client, "itsRestTemplate")).isNotNull();
        assertThat(ReflectionTestUtils.getField(client, "gisRestTemplate")).isNotNull();
    }

    @Test
    void getForItsDelegatesToItsTemplate() {
        RestTemplate mockIts = mock(RestTemplate.class);
        ReflectionTestUtils.setField(client, "itsRestTemplate", mockIts);

        when(mockIts.getForObject("http://its.test.com/traffic", String.class)).thenReturn("trafficData");

        String result = client.getForIts("http://its.test.com/traffic", String.class);

        assertThat(result).isEqualTo("trafficData");
        verify(mockIts).getForObject("http://its.test.com/traffic", String.class);
    }

    @Test
    void exchangeForGisDelegatesToGisTemplate() {
        RestTemplate mockGis = mock(RestTemplate.class);
        ReflectionTestUtils.setField(client, "gisRestTemplate", mockGis);

        ResponseEntity<String> expected = ResponseEntity.ok("gisData");
        when(mockGis.exchange(anyString(), any(HttpMethod.class), any(), eq(String.class)))
                .thenReturn(expected);

        ResponseEntity<String> result = client.exchangeForGis(
                "http://gis.test.com/api", HttpMethod.GET, null, String.class);

        assertThat(result.getBody()).isEqualTo("gisData");
        verify(mockGis).exchange("http://gis.test.com/api", HttpMethod.GET, null, String.class);
    }
}
