using MiningService.Domain.SeedWork;

namespace MiningService.Domain.AggregatesModel.ConfigurationAggregate;

/// <summary>
/// EN: Mining Configuration aggregate root - controls base mining parameters.
/// VI: Aggregate root Cấu hình Đào - điều khiển các tham số đào cơ bản.
/// </summary>
public class MiningConfiguration : Entity, IAggregateRoot
{
    public const string ConfigKey = "mining";

    /// <summary>
    /// EN: Base mining rate in MP per hour.
    /// VI: Tốc độ đào cơ bản theo MP mỗi giờ.
    /// </summary>
    public decimal BaseRate { get; private set; }

    /// <summary>
    /// EN: Session duration in hours.
    /// VI: Thời lượng phiên tính bằng giờ.
    /// </summary>
    public int SessionDurationHours { get; private set; }

    /// <summary>
    /// EN: Maximum sessions per day.
    /// VI: Số phiên tối đa mỗi ngày.
    /// </summary>
    public int MaxSessionsPerDay { get; private set; }

    /// <summary>
    /// EN: Whether mining is globally enabled.
    /// VI: Đào có được bật toàn cục không.
    /// </summary>
    public bool IsGloballyEnabled { get; private set; }

    /// <summary>
    /// EN: Last updated timestamp.
    /// VI: Thời điểm cập nhật cuối.
    /// </summary>
    public DateTime UpdatedAt { get; private set; }

    /// <summary>
    /// EN: Who last updated the configuration.
    /// VI: Ai đã cập nhật cấu hình cuối cùng.
    /// </summary>
    public Guid UpdatedBy { get; private set; }

    private MiningConfiguration() { }

    public static MiningConfiguration CreateDefault()
    {
        return new MiningConfiguration
        {
            Id = Guid.NewGuid(),
            BaseRate = 0.25m,
            SessionDurationHours = 24,
            MaxSessionsPerDay = 1,
            IsGloballyEnabled = true,
            UpdatedAt = DateTime.UtcNow,
            UpdatedBy = Guid.Empty
        };
    }

    public void Update(decimal? baseRate, int? sessionDurationHours, int? maxSessionsPerDay, bool? isEnabled, Guid updatedBy)
    {
        if (baseRate.HasValue && baseRate.Value > 0)
            BaseRate = baseRate.Value;
        if (sessionDurationHours.HasValue && sessionDurationHours.Value > 0)
            SessionDurationHours = sessionDurationHours.Value;
        if (maxSessionsPerDay.HasValue && maxSessionsPerDay.Value > 0)
            MaxSessionsPerDay = maxSessionsPerDay.Value;
        if (isEnabled.HasValue)
            IsGloballyEnabled = isEnabled.Value;

        UpdatedAt = DateTime.UtcNow;
        UpdatedBy = updatedBy;
    }
}
