package space.nstart.pcp.pcp_mission_planing_service.controller

import java.util.UUID

/**
 * Коды правил валидации. MVP: валидатор-заглушка их **не вычисляет** — список существует как
 * стабильный контракт для фронта, чтобы появление реальных правил (раздел 6 дизайн-дока) не ломало схему.
 */
object ConflictRule {
    /** Пересечение по времени между включениями (съёмка↔съёмка, съёмка↔сброс, сброс↔сброс). */
    const val TIME_OVERLAP = "TIME_OVERLAP"
    /** Окно съёмки вне окна видимости цели (баллистика). */
    const val TARGET_VISIBILITY = "TARGET_VISIBILITY"
    /** Окно сброса вне зоны радиовидимости станции. */
    const val COMMS_SESSION = "COMMS_SESSION"
    /** Сбрасываемая съёмка не завершается строго до начала зоны сброса. */
    const val DROP_ORDER = "DROP_ORDER"
    /** Бортовые ограничения: длительность/скважность, энергетика, память. */
    const val ONBOARD_LIMIT = "ONBOARD_LIMIT"
}

/** Уровень конфликта: [ERROR] блокирует «Применить», [WARNING] — информативный. */
object ConflictSeverity {
    const val ERROR = "error"
    const val WARNING = "warning"
}

/**
 * Один конфликт на затронутом включении. Возвращается диффом по режимам (а не как весь план),
 * чтобы фронт мог точечно подсвечивать проблемные включения.
 *
 * @param modeId id режима (survey или drop), к которому относится конфликт.
 * @param rule код правила, см. [ConflictRule].
 * @param severity уровень, см. [ConflictSeverity].
 * @param message человекочитаемое описание для оператора.
 * @param relatedModeId id второго участника парного правила (например, пересечения по времени), если есть.
 */
data class ModeConflict(
    val modeId: Long,
    val rule: String,
    val severity: String,
    val message: String,
    val relatedModeId: Long? = null
)

/**
 * Результат валидации миссии-черновика.
 *
 * MVP: [conflicts] всегда пуст — реальные правила ещё не считаются (TODO раздела 6 дизайн-дока).
 * Контракт стабилен: фронт уже завязывается на него и не сломается, когда правила появятся.
 */
data class MissionValidationResponse(
    val missionId: UUID,
    val conflicts: List<ModeConflict>
)
