using MiningService.Domain.SeedWork;

namespace MiningService.Domain.AggregatesModel.MinerAggregate;

/// <summary>
/// EN: Entity tracking mining history entries.
/// VI: Entity theo dõi các bản ghi lịch sử đào.
/// </summary>
public class MiningHistory : Entity
{
    /// <summary>EN: Miner who earned these points / VI: Thợ đào kiếm được điểm này</summary>
    public Guid MinerId { get; private set; }
    
    /// <summary>EN: Points earned in this entry / VI: Điểm kiếm được trong bản ghi này</summary>
    public decimal PointsEarned { get; private set; }
    
    /// <summary>EN: Source of points / VI: Nguồn điểm</summary>
    public string Source { get; private set; } = string.Empty;
    
    /// <summary>EN: Session ID if from mining / VI: ID phiên nếu từ đào</summary>
    public Guid? SessionId { get; private set; }
    
    /// <summary>EN: When points were earned / VI: Khi nào điểm được kiếm</summary>
    public DateTime EarnedAt { get; private set; }
    
    /// <summary>EN: Mining rate at time of earning / VI: Tỷ lệ đào khi kiếm điểm</summary>
    public decimal HourlyRateSnapshot { get; private set; }
    
    /// <summary>EN: Streak day at time of earning / VI: Ngày streak khi kiếm điểm</summary>
    public int StreakDaySnapshot { get; private set; }

    // EF Core constructor
    protected MiningHistory() { }

    /// <summary>
    /// EN: Create mining history from session claim.
    /// VI: Tạo lịch sử đào từ việc nhận thưởng phiên.
    /// </summary>
    public static MiningHistory CreateFromSession(
        Guid minerId, 
        decimal pointsEarned, 
        Guid sessionId,
        decimal hourlyRate,
        int streakDay)
    {
        return new MiningHistory
        {
            Id = Guid.NewGuid(),
            MinerId = minerId,
            PointsEarned = pointsEarned,
            Source = "Mining",
            SessionId = sessionId,
            EarnedAt = DateTime.UtcNow,
            HourlyRateSnapshot = hourlyRate,
            StreakDaySnapshot = streakDay
        };
    }
    
    /// <summary>
    /// EN: Create mining history from bonus (referral, milestone, etc).
    /// VI: Tạo lịch sử đào từ thưởng (giới thiệu, mốc, v.v.).
    /// </summary>
    public static MiningHistory CreateFromBonus(
        Guid minerId, 
        decimal pointsEarned, 
        string source)
    {
        return new MiningHistory
        {
            Id = Guid.NewGuid(),
            MinerId = minerId,
            PointsEarned = pointsEarned,
            Source = source,
            SessionId = null,
            EarnedAt = DateTime.UtcNow,
            HourlyRateSnapshot = 0,
            StreakDaySnapshot = 0
        };
    }
}
