using System;
using System.ComponentModel.DataAnnotations;

namespace AsbCloudApp.Data;

/// <summary>
/// DTO уведомления
/// </summary>
public class NotificationDto : IId
{
	/// <summary>
	/// Id уведомления
	/// </summary>
	[Required]	
	public int Id { get; set; }

    /// <summary>
    /// Id получателя уведомления
    /// </summary>
    [Required]
    public int IdUser { get; set; }

    /// <summary>
    /// Id категории уведомления
    /// </summary>
    [Required]
    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>
    [Required]
    public DateTimeOffset RegistrationDate { get; set; }

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

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

    /// <summary>
    /// Состояние уведомления
    /// 0 - Зарегистрировано,
    /// 1 - Отправлено,
    /// 2 - Прочитано
    /// </summary>
    [Required]
    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 = DateTimeOffset.UtcNow;
					ReadDate = null;
					break;
				case 2:
					SentDate = DateTimeOffset.UtcNow;
					ReadDate = DateTimeOffset.UtcNow;
					break;
			}
		}
	}

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

    /// <summary>
    /// DTO категории уведомления
    /// </summary>
    [Required]
    public NotificationCategoryDto NotificationCategory { get; set; } = null!;
}