namespace Domain.Entities
{
    /// Estado de reserva (establecido en decisiones 2025-10-12)
    public enum StockReservationStatus
    {
        Reserved = 1,   // Activa: descuenta disponibilidad
        Consumed = 2,   // Consumida al cerrar expedición
        Released = 3    // Liberada por cancelación / devolución
    }
    public class ELSStockReservation
    {
        /// <summary>
        /// Identificador autoincremental de la reserva.
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// Tipo de origen de la reserva. 1=Expedition (extensible a futuros orígenes).
        /// </summary>
        public byte SourceType { get; set; }

        /// <summary>
        /// Identificador del origen. Ej.: expedition_id cuando source_type=1.
        /// </summary>
        public int SourceId { get; set; }

        /// <summary>
        /// Referencia al StockItem exacto bloqueado (FK a PhLSM_StockItem). Define producto/ubicación/trazabilidad por JOIN.
        /// </summary>
        public int StockitemId { get; set; }

        /// <summary>
        /// Cantidad reservada (bloqueada). No disponible mientras status=1 (Reserved).
        /// </summary>
        public decimal ReservedQuantity { get; set; }

        /// <summary>
        /// Estado de la reserva: 1=Reserved, 2=Released, 3=Consumed.
        /// </summary>
        public StockReservationStatus Status { get; set; } = StockReservationStatus.Reserved;

        /// <summary>
        /// Fecha/hora de creación (UTC).
        /// </summary>
        public DateTime Createdat { get; set; }

        /// <summary>
        /// Última modificación (UTC). Puede ser NULL si nunca se actualizó.
        /// </summary>
        public DateTime? Modifiedat { get; set; }

        /// <summary>
        /// Token de concurrencia optimista (ROWVERSION) para actualizaciones seguras.
        /// </summary>
        public byte[] Rowversion { get; set; } = Array.Empty<byte>();
    }
}
