#if NET
using System.Text.Json.Serialization;

namespace DigitalData.Core.Abstraction.Application.DTO;

/// <summary>
/// Represents the result of an operation, containing information about its success or failure,
/// messages for the client, and notices for logging.
/// </summary>
[Obsolete("Use DigitalData.Core.Exceptions and .Middleware")]
public class Result
{
    /// <summary>
    /// Gets or sets a value indicating whether the operation was successful.
    /// </summary>
    [Obsolete("Use DigitalData.Core.Exceptions and .Middleware")]
    public bool IsSuccess { get; set; } = false;

    /// <summary>
    /// Gets a value indicating whether the operation failed.
    /// </summary>
    [Obsolete("Use DigitalData.Core.Exceptions and .Middleware")]
    public bool IsFailed => !IsSuccess;

    /// <summary>
    /// Gets a list of messages intended for the client.
    /// </summary>
    [Obsolete("Use DigitalData.Core.Exceptions and .Middleware")]
    public List<string> Messages { get; init; } = new();

    /// <summary>
    /// Gets a list of notices intended for logging purposes. This property is ignored during JSON serialization.
    /// </summary>
    [Obsolete("Use DigitalData.Core.Exceptions and .Middleware")]
    [JsonIgnore]
    public List<Notice> Notices = new();

    /// <summary>
    /// Creates a <see cref="DataResult{T}"/> with the specified data.
    /// </summary>
    /// <typeparam name="T">The type of the data.</typeparam>
    /// <param name="data">The data to include in the result.</param>
    /// <returns>A new <see cref="DataResult{T}"/> instance.</returns>
    [Obsolete("Use DigitalData.Core.Exceptions and .Middleware")]
    public DataResult<T> Data<T>(T data) => new()
    {
        IsSuccess = IsSuccess,
        Messages = Messages,
        Notices = Notices,
        Data = data
    };

    /// <summary>
    /// Checks if any notice has the specified flag.
    /// </summary>
    /// <param name="flag">The flag to check.</param>
    /// <returns>True if any notice has the specified flag; otherwise, false.</returns>
    [Obsolete("Use DigitalData.Core.Exceptions and .Middleware")]
    public bool HasFlag(Enum flag) => Notices.Any(n => n.Flag?.ToString() == flag.ToString());

    /// <summary>
    /// Checks if any notice has any of the specified flags.
    /// </summary>
    /// <param name="flags">The flags to check.</param>
    /// <returns>True if any notice has any of the specified flags; otherwise, false.</returns>
    [Obsolete("Use DigitalData.Core.Exceptions and .Middleware")]
    public bool HasAnyFlag(params Enum[] flags) => flags.Any(HasFlag);

    /// <summary>
    /// Creates a new successful <see cref="Result"/>.
    /// </summary>
    /// <returns>A new successful <see cref="Result"/>.</returns>
    [Obsolete("Use DigitalData.Core.Exceptions and .Middleware")]
    public static Result Success() => new() { IsSuccess = true };

    /// <summary>
    /// Creates a new failed <see cref="Result"/>.
    /// </summary>
    /// <returns>A new failed <see cref="Result"/>.</returns>
    [Obsolete("Use DigitalData.Core.Exceptions and .Middleware")]
    public static Result Fail() => new() { IsSuccess = false };

    /// <summary>
    /// Creates a new successful <see cref="DataResult{T}"/> with the specified data.
    /// </summary>
    /// <typeparam name="T">The type of the data.</typeparam>
    /// <param name="data">The data to include in the result.</param>
    /// <returns>A new successful <see cref="DataResult{T}"/> with the specified data.</returns>
    [Obsolete("Use DigitalData.Core.Exceptions and .Middleware")]
    public static DataResult<T> Success<T>(T data) => new()
    {
        IsSuccess = true,
        Data = data
    };

    /// <summary>
    /// Creates a new failed <see cref="DataResult{T}"/> with no data.
    /// </summary>
    /// <typeparam name="T">The type of the data.</typeparam>
    /// <returns>A new failed <see cref="DataResult{T}"/> with no data.</returns>
    [Obsolete("Use DigitalData.Core.Exceptions and .Middleware")]
#pragma warning disable CS8601 // Possible null reference assignment.
    public static DataResult<T> Fail<T>() => new()
    {
        IsSuccess = false,
        Data = default
    };
#pragma warning restore CS8601 // Possible null reference assignment.
}
#endif