namespace WebClientBase.Shared;

/// <summary>
/// EN: Standard API response wrapper for consistent response format.
/// VI: Wrapper response API chuẩn cho định dạng response nhất quán.
/// </summary>
/// <typeparam name="T">The type of data in the response.</typeparam>
public class ApiResponse<T>
{
    /// <summary>
    /// EN: Indicates if the request was successful.
    /// VI: Cho biết request có thành công không.
    /// </summary>
    public bool Success { get; set; }

    /// <summary>
    /// EN: The response data.
    /// VI: Dữ liệu response.
    /// </summary>
    public T? Data { get; set; }

    /// <summary>
    /// EN: Error message if request failed.
    /// VI: Thông báo lỗi nếu request thất bại.
    /// </summary>
    public string? Error { get; set; }

    /// <summary>
    /// EN: Creates a successful response with data.
    /// VI: Tạo response thành công với dữ liệu.
    /// </summary>
    public static ApiResponse<T> Ok(T data) => new() { Success = true, Data = data };

    /// <summary>
    /// EN: Creates a failed response with error message.
    /// VI: Tạo response thất bại với thông báo lỗi.
    /// </summary>
    public static ApiResponse<T> Fail(string error) => new() { Success = false, Error = error };
}

/// <summary>
/// EN: Non-generic API response for operations without return data.
/// VI: API response không generic cho các operation không có dữ liệu trả về.
/// </summary>
public class ApiResponse : ApiResponse<object>
{
    /// <summary>
    /// EN: Creates a successful response.
    /// VI: Tạo response thành công.
    /// </summary>
    public static new ApiResponse Ok() => new() { Success = true };

    /// <summary>
    /// EN: Creates a failed response with error message.
    /// VI: Tạo response thất bại với thông báo lỗi.
    /// </summary>
    public static new ApiResponse Fail(string error) => new() { Success = false, Error = error };
}
