using Monitoring.Core.Domain.Primitives;

namespace Monitoring.Core.Domain.EventManagement;

/// <summary>
/// Тревога.
/// </summary>
public class Alarm
{
	/// <summary>
	/// ИД.
	/// </summary>
	public AlarmId Id { get; } = default!;

	/// <summary>
	/// ИД события, вызвавшее тревогу.
	/// </summary>
	public EventId EventId { get; } = default!;

	/// <summary>
	/// Слбытие, вызвавшее тревогу.
	/// </summary>
	public Event Event { get; } = default!;

	/// <summary>
	/// ИД зоны, где сработала тревога.
	/// </summary>
	public ZoneId ZoneId { get; } = default!;

	/// <summary>
	/// Зоны, где сработала тревога.
	/// </summary>
	public Zone Zone { get; } = default!;

	/// <summary>
	/// Признак реальности тревоги. Реальная/ложная тревога.
	/// </summary>
	[Obsolete("Use AlarmScopeStatus instead")]
	public bool IsReal { get; set; }

	public AlarmScope Scope { get; } = default!;
	public AlarmScopeId ScopeId { get; } = default!;

	/// <summary>
	/// Создает объект тревоги.
	/// </summary>
	/// <param name="eventId">ИД события.</param>
	/// <param name="zoneId">ИД зоны.</param>
	/// <returns>Новый объект тревоги.</returns>
	public static Alarm Create(EventId eventId, ZoneId zoneId, AlarmScopeId scopeId)
	{
		return new Alarm(eventId, zoneId, scopeId);
	}

	private Alarm(EventId eventId, ZoneId zoneId, AlarmScopeId scopeId)
	{
		this.Id = new AlarmId(Guid.CreateVersion7());
		this.EventId = eventId;
		this.ZoneId = zoneId;
		this.ScopeId = scopeId;
	}

	protected Alarm() { }
}
