package space.nstart.pcp_tgu_service.repository

/** Предоставляет методы доступа к БД для отслеживаемых планов и их состояний. */
import space.nstart.pcp_tgu_service.entity.TrackedPlanEntity
import space.nstart.pcp_tgu_service.entity.TrackedPlanStatus
import org.springframework.data.jpa.repository.JpaRepository
import java.time.LocalDateTime
import java.util.UUID

interface TrackedPlanJpaRepository : JpaRepository<TrackedPlanEntity, UUID> {
    /** Возвращает отслеживаемые планы КА в указанном статусе. */
    fun findAllBySpacecraftIdAndStatus(spacecraftId: String, status: TrackedPlanStatus): List<TrackedPlanEntity>

    /** Возвращает все tracked-планы КА, упорядоченные по времени старта. */
    fun findAllBySpacecraftIdOrderByStartTime(spacecraftId: String): List<TrackedPlanEntity>

    /** Возвращает планы, подтверждённые с указанного момента, упорядоченные по времени старта. */
    fun findAllBySpacecraftIdAndStatusAndConfirmedAtGreaterThanEqualOrderByStartTime(
        spacecraftId: String,
        status: TrackedPlanStatus,
        confirmedAt: LocalDateTime
    ): List<TrackedPlanEntity>

    /** Возвращает отслеживаемый план по его бизнес-полям и статусу. */
    fun findBySpacecraftIdAndStartTimeAndEndTimeAndKppIdAndStatus(
        spacecraftId: String,
        startTime: LocalDateTime,
        endTime: LocalDateTime,
        kppId: String,
        status: TrackedPlanStatus
    ): TrackedPlanEntity?

    /** Возвращает последний tracked-план с теми же бизнес-полями независимо от статуса. */
    fun findTopBySpacecraftIdAndStartTimeAndEndTimeAndKppIdOrderByCreatedAtDesc(
        spacecraftId: String,
        startTime: LocalDateTime,
        endTime: LocalDateTime,
        kppId: String
    ): TrackedPlanEntity?

    /** Возвращает последний подтверждённый отслеживаемый план для КА. */
    fun findTopBySpacecraftIdAndStatusOrderByConfirmedAtDesc(
        spacecraftId: String,
        status: TrackedPlanStatus
    ): TrackedPlanEntity?
}
