package space.nstart.pcp_tgu_service.integration.api

/** Вызывает сервис классификатора и возвращает сырые метаданные платформ. */
import space.nstart.pcp_tgu_service.config.ClassifierProperties
import space.nstart.pcp_tgu_service.dto.NsiPlatformDto
import org.springframework.stereotype.Component
import org.springframework.web.reactive.function.client.WebClient
import org.springframework.web.reactive.function.client.WebClientException
import org.springframework.web.reactive.function.client.WebClientResponseException

/**
 * HTTP-клиент для получения списка космических аппаратов из классификатора.
 */
@Component
class PlatformsClassifierClient(
    private val classifierProperties: ClassifierProperties
) {

    private val webClient: WebClient = WebClient.builder()
        .baseUrl(classifierProperties.platformsUrl)
        .build()

    /**
     * Загружает список платформ из классификатора НСИ.
     */
    fun fetchPlatforms(): List<NsiPlatformDto> =
        try {
            val platforms = webClient.get()
                .retrieve()
                .bodyToMono(Array<NsiPlatformDto>::class.java)
                .block()

            platforms?.toList()
                ?: throw OrdinisUnavailableException(
                    classifierUrl = classifierProperties.platformsUrl,
                    statusCode = null,
                    cause = IllegalStateException("Classifier response body is empty: ${classifierProperties.platformsUrl}")
                )
        } catch (ex: WebClientException) {
            throw OrdinisUnavailableException(
                classifierUrl = classifierProperties.platformsUrl,
                statusCode = (ex as? WebClientResponseException)?.statusCode?.value(),
                cause = ex
            )
        }
}

/**
 * Семантическая ошибка недоступности Ordinis/НСИ, чтобы service layer мог безопасно
 * отличить outage внешней зависимости от ошибок маппинга или доменной логики.
 */
class OrdinisUnavailableException(
    val classifierUrl: String,
    val statusCode: Int?,
    cause: Throwable
) : RuntimeException("Ordinis classifier is unavailable: $classifierUrl", cause)
