package space.nstart.pcp_tgu_service.integration.api

import com.fasterxml.jackson.databind.ObjectMapper
import org.springframework.stereotype.Component
import space.nstart.pcp_tgu_service.domain.InsertionPoint
import space.nstart.pcp_tgu_service.domain.ObservationWindow
import space.nstart.pcp_tgu_service.domain.SpacecraftPoints
import space.nstart.pcp_tgu_service.dto.ExternalRvaItemDto
import java.time.Instant
import java.time.LocalDateTime
import java.time.ZoneId
import java.time.format.DateTimeParseException

/**
 * Парсит raw payload баллистики в доменную модель расчёта без доступа к БД.
 */
@Component
class VisibilityPayloadParser(
    private val objectMapper: ObjectMapper
) {
    private val zoneId: ZoneId = ZoneId.systemDefault()

    /** Группирует RVA records по станциям и сортирует окна для алгоритма планирования. */
    fun parse(spacecraftId: String, payloadJson: String): SpacecraftPoints {
        val response = objectMapper.readValue(payloadJson, Array<ExternalRvaItemDto>::class.java).toList()
        val points = response
            .groupBy { item -> item.stationId }
            .map { (stationId, items) ->
                InsertionPoint(
                    pointId = stationId.toString(),
                    observationWindows = items.map { item ->
                        ObservationWindow(
                            startTime = toLocalDateTime(item.onStart.time),
                            endTime = toLocalDateTime(item.onStop.time),
                            elevationAngle = item.onMaximum.elevation
                        )
                    }.sortedBy { window -> window.startTime }
                )
            }
            .sortedBy { point -> point.pointId }

        return SpacecraftPoints(spacecraftId = spacecraftId, points = points)
    }

    /** Разбирает UTC/ISO строку времени в локальную LocalDateTime, как делал прежний client. */
    private fun toLocalDateTime(value: String): LocalDateTime =
        try {
            Instant.parse(value).atZone(zoneId).toLocalDateTime()
        } catch (_: DateTimeParseException) {
            LocalDateTime.parse(value)
        }
}
