package space.nstart.pcp_tgu_service.dto

import space.nstart.pcp_tgu_service.domain.CalculatedPlan
import java.time.LocalDateTime
import java.util.UUID

/** «Сырое» окно ЗРВ КА для ручного набора плана новой цепочки. Времена — naive ISO без зоны. */
data class ZrvWindowResponse(
    val startTime: LocalDateTime,
    val endTime: LocalDateTime,
    val kppId: String
) {
    companion object {
        fun from(window: CalculatedPlan): ZrvWindowResponse =
            ZrvWindowResponse(
                startTime = window.startTime,
                endTime = window.endTime,
                kppId = window.kppId
            )
    }
}

/**
 * Запрос создания плана новой цепочки (вкладка «Планы», действие оператора «Создать план»).
 *
 * Окно набирается из двух реальных ЗРВ: [windowStart]/[windowKppId] — начало (старт и КПП берутся
 * у одной зоны), [windowStop] — конец (конец другой, не раньше начала зоны). [basePlanId] —
 * «предыстория»: прошлый план КА, чьё содержимое клонируется в окно и от которого тянется история
 * (`base_plan_id`). Если `null` — цепочка без истории: создаётся пустой план, наполняемый с нуля.
 */
data class CreateChainPlanRequest(
    /** КА (= noradId строкой); обязателен для сценария «без базы». */
    val spacecraftId: String,
    /** Прошлый план-предыстория или null для цепочки без истории. */
    val basePlanId: UUID? = null,
    /** Начало окна (naive, локальное время) — старт выбранной стартовой ЗРВ. */
    val windowStart: LocalDateTime,
    /** Конец окна (naive, локальное время) — конец выбранной конечной ЗРВ. */
    val windowStop: LocalDateTime,
    /** КПП стартовой ЗРВ. */
    val windowKppId: String
)

/**
 * Ответ создания плана новой цепочки: id плана-кандидата (DRAFT, применяется через `promote`) и
 * прогноз будущей цепочки от его окна (what-if, состояние КА не тронуто).
 */
data class CreateChainPlanResponse(
    val draftPlanId: UUID,
    val projectedChain: List<PlanResponse>
)
