using System;
using System.ComponentModel.DataAnnotations;

namespace AsbCloudApp.Data;

/// <summary>
/// DTO уведомления
/// </summary>
public class NotificationDto : IId
{
	/// <summary>
	/// Id уведомления
	/// </summary>
	public int Id { get; set; }
	
	/// <summary>
	/// Id получателя уведомления
	/// </summary>
	public int IdUser { get; set; }

	/// <summary>
	/// Id категории уведомления
	/// </summary>
	public int IdNotificationCategory { get; set; }

	/// <summary>
	/// Заголовок уведомления
	/// </summary>
	[Required, StringLength(300, MinimumLength = 1, ErrorMessage = "Заголовок должен мыть не меньше 1-го знака и не больше 300")]
	public string Title { get; set; } = null!;

    /// <summary>
    /// Сообщение уведомления
    /// </summary>
    [Required, StringLength(2048, MinimumLength = 1, ErrorMessage = "Заголовок должен мыть не меньше 1-го знака и не больше 2048")]
    public string Message { get; set; } = null!;

	/// <summary>
	/// Дата регистрации уведомления
	/// </summary>
	public DateTime RegistrationDate { get; set; }

	/// <summary>
	/// Дата отправки уведомления
	/// </summary>
	public DateTime? SentDate { get; set; }

	/// <summary>
	/// Дата прочтения уведомления
	/// </summary>
	public DateTime? ReadDate { get; set; }

	/// <summary>
	/// Состояние уведомления
	/// 0 - Зарегистрировано,
	/// 1 - Отправлено,
	/// 2 - Прочитано
	/// </summary>
	public int IdState
	{
		get
		{
			if (SentDate is not null && ReadDate is not null)
				return 2;

			if (SentDate is not null)
				return 1;

			return 0;
		}
		set
		{
			switch (value)
			{
				case 0:
					SentDate = null;
					ReadDate = null;
					break;
				case 1:
					SentDate = DateTime.UtcNow;
					ReadDate = null;
					break;
				case 2:
					SentDate = DateTime.UtcNow;
					ReadDate = DateTime.UtcNow;
					break;
			}
		}
	}

	/// <summary>
	/// Id типа доставки уведомления
	/// 0 - SignalR
	/// 1 - Email
	/// </summary>
	[Range(0,1)]
	public int IdTransportType { get; set; }
	
	/// <summary>
	/// DTO категории уведомления
	/// </summary>
	public NotificationCategoryDto NotificationCategory { get; set; } = null!;
}