using Monitoring.Core.Domain.UserPrimitives;

namespace Monitoring.Core.Domain.EventManagement;

/// <summary>
/// Изменение статуса тревоги.
/// </summary>
public class AlarmScopeStatusChanging
{
	/// <summary>
	/// ИД.
	/// </summary>
	public AlarmScopeStatusChangingId Id { get; } = null!;

	/// <summary>
	/// Группа, для которой изменяется статус.
	/// </summary>
	public AlarmScope AlarmScope { get; } = null!;

	/// <summary>
	/// ИД группы.
	/// </summary>
	public AlarmScopeId AlarmScopeId { get; } = null!;

	/// <summary>
	/// Пользователь, кто изменил статус.
	/// </summary>
	public User? User { get; }

	/// <summary>
	/// ИД пользователя, кто изменил статус.
	/// </summary>
	public UserId? UserId { get; }

	/// <summary>
	/// Дата и время изменения статуса.
	/// </summary>
	public DateTime CreatedAt { get; }

	/// <summary>
	/// Новый статус группы.
	/// </summary>
	public AlarmScopeStatus Status { get; }

	/// <summary>
	/// Создает объект изменения статуса группы.
	/// </summary>
	/// <param name="alarmScopeId">ИД группы.</param>
	/// <param name="userId">ИД пользователя.</param>
	/// <param name="status">Новый статус группы.</param>
	/// <returns>Новый объект изменения статуса группы.</returns>
	public static AlarmScopeStatusChanging Create(
		AlarmScopeId alarmScopeId,
		UserId? userId,
		AlarmScopeStatus status
	)
	{
		return new AlarmScopeStatusChanging(alarmScopeId, userId, status);
	}

	private AlarmScopeStatusChanging(
		AlarmScopeId alarmScopeId,
		UserId? userId,
		AlarmScopeStatus status
	)
	{
		this.Id = new AlarmScopeStatusChangingId(Guid.CreateVersion7());
		this.AlarmScopeId = alarmScopeId;
		this.UserId = userId;
		this.CreatedAt = DateTime.UtcNow;
		this.Status = status;
	}

	// Constructor for EF
	protected AlarmScopeStatusChanging() { }
}
