using Lada.Framework.Data.Domains.BaseEntities;
using Lada.Framework.Data.Domains.Identity;
using Lada.Framework.Data.Enums;
using System.ComponentModel.DataAnnotations;

namespace Lada.Framework.Data.Domains.Rewards
{
    /// <summary>
    /// Phiếu ghi nhận Thưởng/Phạt. Dùng chung cho cả tạo thủ công và sinh tự động.
    /// </summary>
    public class RewardPenaltyTicket : BaseEntityWithKey<int>
    {
        /// <summary>
        /// Mã phiếu (tự sinh)
        /// </summary>
        [MaxLength(50)]
        public string Code { get; set; } = string.Empty;

        /// <summary>
        /// Người bị áp dụng thưởng/phạt
        /// </summary>
        public int UserId { get; set; }

        /// <summary>
        /// Loại phiếu: Thưởng / Phạt
        /// </summary>
        public TicketType TicketType { get; set; }

        /// <summary>
        /// Nguồn: Thủ công / Tự động
        /// </summary>
        public TicketSource Source { get; set; }

        /// <summary>
        /// Số tiền thưởng/phạt
        /// </summary>
        public decimal Amount { get; set; }

        /// <summary>
        /// Tóm tắt nội dung / lý do
        /// </summary>
        [MaxLength(500)]
        public string Reason { get; set; } = string.Empty;

        /// <summary>
        /// Trạng thái phiếu
        /// </summary>
        public TicketStatus Status { get; set; } = TicketStatus.Draft;

        /// <summary>
        /// Liên kết tới vi phạm tự động (chỉ có khi Source = Automated)
        /// </summary>
        public int? ViolationId { get; set; }

        /// <summary>
        /// Ngày phát sinh vi phạm (chỉ có khi Source = Automated)
        /// </summary>
        public DateTime? BusinessDate { get; set; }

        #region Gỡ biên bản (Amnesty)

        /// <summary>
        /// Người thực hiện gỡ biên bản
        /// </summary>
        public int? ForgivenBy { get; set; }

        /// <summary>
        /// Thời điểm gỡ biên bản
        /// </summary>
        public DateTimeOffset? ForgivenAt { get; set; }

        /// <summary>
        /// Lý do gỡ biên bản
        /// </summary>
        [MaxLength(500)]
        public string? ForgiveReason { get; set; }

        #endregion

        #region Navigation Properties

        public virtual User User { get; set; }
        public virtual UserCashViolation? Violation { get; set; }

        #endregion
    }
}
