namespace PromotionService.Domain.AggregatesModel.RedemptionAggregate;

using PromotionService.Domain.SeedWork;

/// <summary>
/// EN: Redemption Aggregate Root - records voucher redemption history.
/// VI: Redemption Aggregate Root - ghi lại lịch sử sử dụng voucher.
/// </summary>
public class Redemption : Entity, IAggregateRoot
{
    /// <summary>
    /// EN: ID of the voucher that was redeemed.
    /// VI: ID của voucher được sử dụng.
    /// </summary>
    public Guid VoucherId { get; private set; }

    /// <summary>
    /// EN: ID of the campaign.
    /// VI: ID của chiến dịch.
    /// </summary>
    public Guid CampaignId { get; private set; }

    /// <summary>
    /// EN: ID of the user who redeemed.
    /// VI: ID của người dùng sử dụng.
    /// </summary>
    public Guid UserId { get; private set; }

    /// <summary>
    /// EN: Order ID if linked to an order.
    /// VI: ID đơn hàng nếu liên kết với đơn hàng.
    /// </summary>
    public Guid? OrderId { get; private set; }

    /// <summary>
    /// EN: Amount used from the voucher.
    /// VI: Số tiền sử dụng từ voucher.
    /// </summary>
    public decimal AmountUsed { get; private set; }

    /// <summary>
    /// EN: Amount refunded to merchant (surplus).
    /// VI: Số tiền hoàn lại cho merchant (dư).
    /// </summary>
    public decimal AmountRefunded { get; private set; }

    /// <summary>
    /// EN: Execution reference from Wallet Service.
    /// VI: Tham chiếu thực thi từ Wallet Service.
    /// </summary>
    public string? ExecutionReference { get; private set; }

    /// <summary>
    /// EN: When the redemption occurred.
    /// VI: Thời điểm sử dụng.
    /// </summary>
    public DateTime RedeemedAt { get; private set; }

    /// <summary>
    /// EN: Creation timestamp.
    /// VI: Thời điểm tạo.
    /// </summary>
    public DateTime CreatedAt { get; private set; }

    // EF Core constructor
    protected Redemption() { }

    /// <summary>
    /// EN: Create a redemption record.
    /// VI: Tạo bản ghi sử dụng.
    /// </summary>
    public Redemption(
        Guid voucherId,
        Guid campaignId,
        Guid userId,
        Guid? orderId,
        decimal amountUsed,
        decimal amountRefunded,
        string? executionReference = null)
    {
        Id = Guid.NewGuid();
        VoucherId = voucherId;
        CampaignId = campaignId;
        UserId = userId;
        OrderId = orderId;
        AmountUsed = amountUsed;
        AmountRefunded = amountRefunded;
        ExecutionReference = executionReference;
        RedeemedAt = DateTime.UtcNow;
        CreatedAt = DateTime.UtcNow;
    }
}
