package org.nstart.dep265.requestservice.dto

import jakarta.validation.constraints.NotBlank
import jakarta.validation.constraints.NotNull
import java.time.LocalDateTime
import java.util.UUID

/**
 * Абсолютный диапазон крена маршрута в градусах.
 */
data class RouteAngleRangeDto(
    /** Минимальное абсолютное значение крена. */
    val min: Double,

    /** Максимальное абсолютное значение крена. */
    val max: Double,
) {
    init {
        require(min <= max) { "Минимальный крен маршрута не может быть больше максимального" }
    }

    fun average(): Double = (min + max) / 2.0
}

/**
 * Внутренняя DTO маршрута, используемая request-service для matching заявок с маршрутами.
 */
data class RouteDto(
    /** Идентификатор маршрута. */
    val routeId: UUID,

    /** Начало интервала выполнения маршрута. */
    @field:NotNull(message = "Время начала маршрута обязательно")
    val intervalBegin: LocalDateTime,

    /** Конец интервала выполнения маршрута. */
    @field:NotNull(message = "Время окончания маршрута обязательно")
    val intervalEnd: LocalDateTime,

    /** Абсолютный диапазон крена маршрута. */
    val rollAngle: RouteAngleRangeDto,

    /** Геометрия маршрута в WKT. */
    @field:NotBlank(message = "Геометрия маршрута обязательна")
    val geometry: String,
)
