package space.nstart.pcp.slots_service.entity

import jakarta.persistence.CascadeType
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.FetchType
import jakarta.persistence.GeneratedValue
import jakarta.persistence.GenerationType
import jakarta.persistence.Id
import jakarta.persistence.JoinColumn
import jakarta.persistence.ManyToOne
import jakarta.persistence.OneToMany
import jakarta.persistence.Table
import org.hibernate.annotations.Fetch
import org.hibernate.annotations.FetchMode
import space.nstart.pcp.pcp_types_lib.dto.requests.slots.BookedSlotDTO
import space.nstart.pcp.pcp_types_lib.dto.requests.slots.BookedSlotStatus


@Entity
@Table(name = "booked_slot")
class BookedSlotEntity(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    val bookedSlotId : Long? = null,
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "slot_id", nullable = false)
    val slot : SlotEntity = SlotEntity(),
    @Column(nullable = false)
    var cycle : Long = 0,
    @OneToMany(
        fetch = FetchType.LAZY,
        mappedBy = "bookedSlot",
        cascade = [CascadeType.PERSIST, CascadeType.MERGE],
        orphanRemoval = true
    )
    @Fetch(FetchMode.SUBSELECT)
    val requests: MutableList<BookedRequestEntity>? = null,
    @Column(name = "status", columnDefinition = "TEXT", nullable = false)
    var status : String = BookedSlotStatus.BOOKED.toString()
) {
    constructor(slot : SlotEntity, cycle : Long) : this(
        null,
        slot,
        cycle
    )

    fun toDTO() = BookedSlotDTO(
        bookedSlotId = bookedSlotId ?: 0,
        satelliteId = slot.satelliteId,
        slotNum = slot.slotNum,
        cycle = cycle
    )

    // Представление брони для фронта (контур/координаты + bookedSlotId + cycle брони) строится в
    // SlotService.toShiftedViewDTO — там доступен КА для сдвига tn/tk/витка на cycle брони. В сущности
    // строить нельзя: без сдвига получался базовый cycle-фрейм и дата брони расходилась с расчётом.
}
