package space.nstart.pcp.pcp_types_lib.dto.satellite.mission

import io.swagger.v3.oas.annotations.media.Schema
import space.nstart.pcp.pcp_types_lib.utils.UtcDateTimes
import java.time.LocalDateTime

/**
 * Запрос на ручное добавление сброса в план по выбранной зоне радиовидимости (ЗРВ).
 *
 * Оператор выбирает ЗРВ станции и набор уже запланированных маршрутов съёмки, время конца
 * которых строго меньше начала зоны (т.е. съёмка успевает завершиться до сеанса сброса).
 * Сброс сохраняется как [space.nstart.pcp.pcp_mission_planing_service]-режим DROP под основным
 * планом миссии (planNumber = 1) с теми же связями съёмка↔сброс, что и при штатном расчёте.
 */
@Schema(description = "Запрос на ручное добавление сброса по выбранной зоне радиовидимости")
data class DropRouteSaveRequestDTO(
    @field:Schema(description = "Идентификатор КА (NORAD)")
    val satelliteId: Long = 0,

    @field:Schema(description = "Идентификатор/номер станции приёма (из ЗРВ)")
    val station: String = "",

    @field:Schema(description = "Номер витка зоны радиовидимости")
    val revolution: Long = 0,

    @field:Schema(description = "Начало зоны радиовидимости (локальное время без зоны)")
    val zoneStart: LocalDateTime = UtcDateTimes.now(),

    @field:Schema(description = "Конец зоны радиовидимости (локальное время без зоны)")
    val zoneStop: LocalDateTime = UtcDateTimes.now(),

    @field:Schema(description = "Идентификаторы режимов съёмки (survey_modes), которые сбрасываются в этой зоне")
    val surveyModeIds: List<Long> = emptyList(),

    @field:Schema(
        description = "Начало интервала плана (локальное время без зоны). Используется только при " +
            "сохранении, если миссии/плана с таким id ещё нет — чтобы создать их с корректным окном.",
        nullable = true
    )
    val planStart: LocalDateTime? = null,

    @field:Schema(
        description = "Конец интервала плана (локальное время без зоны). См. planStart.",
        nullable = true
    )
    val planEnd: LocalDateTime? = null
)
