using Lada.Framework.Data.Domains.BaseEntities;
using Lada.Framework.Data.Domains.Identity;
using Lada.Framework.Data.Enums;

namespace Lada.Framework.Data.Domains.Rewards
{
    /// <summary>
    /// Bản ghi vi phạm nộp tiền trễ.
    /// Mỗi (UserId, BusinessDate) chỉ có tối đa 1 bản ghi (Unique Index).
    /// </summary>
    public class UserCashViolation : BaseEntityWithKey<int>
    {
        /// <summary>
        /// User vi phạm (Cashier đang cầm tiền)
        /// </summary>
        public int UserId { get; set; }

        /// <summary>
        /// Ngày phát sinh tiền thu được
        /// </summary>
        public DateTime BusinessDate { get; set; }

        /// <summary>
        /// Hạn chót đáng lẽ phải nộp (BusinessDate + 1 ngày + CutoffTime)
        /// </summary>
        public DateTimeOffset DeadlineAt { get; set; }

        /// <summary>
        /// Tổng tiền nợ phát sinh ngày BusinessDate
        /// </summary>
        public decimal AmountDue { get; set; }

        /// <summary>
        /// Số tiền đã nộp trước deadline (dựa vào Transaction)
        /// </summary>
        public decimal AmountPaid { get; set; }

        /// <summary>
        /// Số nợ còn thiếu = AmountDue - AmountPaid
        /// </summary>
        public decimal OutstandingAmount { get; set; }

        /// <summary>
        /// Lần vi phạm thứ mấy tại thời điểm tạo (trong chu kỳ ResetPolicy)
        /// </summary>
        public int ViolationCountAtCreation { get; set; }

        /// <summary>
        /// Id cấu hình (version) đang được sử dụng lúc tính lỗi này
        /// </summary>
        public int ConfigIdApplied { get; set; }

        /// <summary>
        /// Trạng thái vi phạm: Active / TicketCreated / Forgiven
        /// </summary>
        public ViolationStatus Status { get; set; } = ViolationStatus.Active;

        #region Navigation Properties

        public virtual User User { get; set; }
        public virtual AutoPenaltyConfig ConfigApplied { get; set; }
        public virtual ICollection<RewardPenaltyTicket> Tickets { get; set; }

        #endregion
    }
}
