package space.nstart.pcp.pcp_types_lib.dto.routes

import com.fasterxml.jackson.annotation.JsonIgnoreProperties
import com.fasterxml.jackson.annotation.JsonAlias
import java.math.BigDecimal
import java.util.UUID
import tools.jackson.databind.JsonNode

/**
 * Raw DTO блока `properties`.
 */
@JsonIgnoreProperties(ignoreUnknown = true)
data class RawPropertiesDto(

    /** Полное имя платформы, например `sentinel-1a`. */
    val platform: String,

    /** Короткое имя аппарата, например `S1A`. */
    val missionId: String,

    /** Абсолютный номер витка орбиты в исходном JSON. */
    @param:com.fasterxml.jackson.annotation.JsonProperty("route:orbit_number")
    val orbitNumber: String,

    /** Направление движения по орбите, например `Descending`. */
    @param:com.fasterxml.jackson.annotation.JsonProperty("sat:orbit_state")
    val orbitState: String,

    /** Время начала съёмки в строковом виде. */
    val intervalBegin: String,

    /** Время окончания съёмки в строковом виде. */
    val intervalEnd: String,

    /** Массив значений угла крена. В текущем JSON это диапазон `[min, max]`. */
    val rollAngle: List<BigDecimal>,

    /** Массив значений угла визирования. В текущем JSON это диапазон `[min, max]`. */
    val visirAngle: List<BigDecimal>,

    /** Разрешение по дальности в строковом виде, например `1.000000e+01`. */
    val resolutionRange: String,

    /** Разрешение по азимуту в строковом виде, например `1.000000e+01`. */
    val resolutionAzimuth: String,

    /** Список поляризаций. */
    val polarisation: List<String>,

    /** Уровень обработки продукта. */
    @param:com.fasterxml.jackson.annotation.JsonProperty("processing:level")
    val processingLevel: String,
)

/**
 * Envelope DTO сообщения, в котором полезная нагрузка маршрута лежит в поле `data`.
 */
@JsonIgnoreProperties(ignoreUnknown = true)
data class RawPassportEnvelopeDto(
    @param:JsonAlias("trace_id", "traceid")
    val traceId: String = "",
    @param:JsonAlias("correlationid")
    val correlationId: String = "",
    val data: RawFeaturePassportJsonDto,
)

/**
 * Raw DTO STAC Feature внутри envelope-сообщения.
 */
@JsonIgnoreProperties(ignoreUnknown = true)
data class RawFeaturePassportJsonDto(
    val id: String,
    val routeId: UUID? = null,
    val collection: String,
    val geometry: RawGeoJsonGeometryDto,
    val properties: RawPropertiesDto,
)

/**
 * Raw DTO GeoJSON-геометрии.
 */
@JsonIgnoreProperties(ignoreUnknown = true)
data class RawGeoJsonGeometryDto(
    val type: String,
    val coordinates: JsonNode,
)
