package space.nstart.pcp_tgu_service.service

import org.slf4j.LoggerFactory
import org.springframework.http.HttpStatus
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import org.springframework.web.server.ResponseStatusException
import space.nstart.pcp_tgu_service.entity.PlannedPlanStatus
import space.nstart.pcp_tgu_service.integration.api.MissionPlaningClient
import space.nstart.pcp_tgu_service.repository.PlannedPlanRepository
import java.util.UUID

/**
 * Отказ от черновика (Ф6): удаляет DRAFT-план и его клон-миссию.
 *
 * Снимает блокировку «один открытый черновик на базу» ([CreateDraftUseCase]) и подчищает
 * осиротевший клон в mission-planing, если оператор начал правку, но не применил её.
 *
 * Порядок: сначала удаляем DRAFT-строку (локально, транзакционно), затем best-effort удаляем
 * клон-миссию. При сбое удаления миссии остаётся лишь осиротевший клон (безвреден, GC позже), но
 * блокирующей DRAFT-строки уже нет — оператор может сразу создать новый черновик. Обратный порядок
 * рисковал бы DRAFT-строкой, ссылающейся на удалённую миссию (вечный 409 + 404 на правках).
 *
 * Удалять разрешено только статус DRAFT — живые/выданные планы этот путь не трогает (422).
 */
@Service
class DeleteDraftUseCase(
    private val plannedPlanRepository: PlannedPlanRepository,
    private val missionPlaningClient: MissionPlaningClient
) {
    private val log = LoggerFactory.getLogger(javaClass)

    @Transactional
    fun deleteDraft(draftPlanId: UUID) {
        val plan = plannedPlanRepository.findById(draftPlanId)
            .orElseThrow { ResponseStatusException(HttpStatus.NOT_FOUND, "Plan $draftPlanId not found") }
        if (plan.status != PlannedPlanStatus.DRAFT) {
            throw ResponseStatusException(
                HttpStatus.UNPROCESSABLE_ENTITY,
                "План $draftPlanId не является черновиком (status=${plan.status}) — удалить можно только DRAFT"
            )
        }
        plannedPlanRepository.delete(plan)
        log.info("Черновик {} удалён (отказ от правок)", draftPlanId)

        // Клон миссии: planId == missionId. Best-effort — сбой удаления клона не откатывает удаление
        // DRAFT-строки (блокирующей строки уже нет; осиротевший клон безвреден, GC позже).
        try {
            missionPlaningClient.deleteMission(draftPlanId)
        } catch (ex: Exception) {
            log.error(
                "Черновик {} удалён, но клон миссии не удалось удалить — остался осиротевший клон",
                draftPlanId, ex
            )
        }
    }
}
