using Nop.Core.Domain.Orders;
using Nop.Core.Domain.Shipping;
using Nop.Web.Models.Order;

namespace Nop.Web.Factories;

/// <summary>
/// Represents the interface of the order model factory
/// </summary>
public partial interface IOrderModelFactory
{
    /// <summary>
    /// Prepare the customer order list model
    /// </summary>
    /// <param name="page">Page number</param>
    /// <param name="limit">Order filtering period</param>
    /// <returns>
    /// A task that represents the asynchronous operation
    /// The task result contains the customer order list model
    /// </returns>
    Task<CustomerOrderListModel> PrepareCustomerOrderListModelAsync(int? page, OrderHistoryPeriods limit);

    /// <summary>
    /// Prepare the customer recurring payment list model
    /// </summary>
    /// <returns>
    /// A task that represents the asynchronous operation
    /// The task result contains the customer recurring payment list model
    /// </returns>
    Task<CustomerRecurringPaymentListModel> PrepareCustomerRecurringPaymentListModelAsync();

    /// <summary>
    /// Prepare the order details model
    /// </summary>
    /// <param name="order">Order</param>
    /// <returns>
    /// A task that represents the asynchronous operation
    /// The task result contains the order details model
    /// </returns>
    Task<OrderDetailsModel> PrepareOrderDetailsModelAsync(Order order);

    /// <summary>
    /// Prepare the shipment details model
    /// </summary>
    /// <param name="shipment">Shipment</param>
    /// <returns>
    /// A task that represents the asynchronous operation
    /// The task result contains the shipment details model
    /// </returns>
    Task<ShipmentDetailsModel> PrepareShipmentDetailsModelAsync(Shipment shipment);

    /// <summary>
    /// Prepare the customer reward points model
    /// </summary>
    /// <param name="page">Number of items page; pass null to load the first page</param>
    /// <returns>
    /// A task that represents the asynchronous operation
    /// The task result contains the customer reward points model
    /// </returns>
    Task<CustomerRewardPointsModel> PrepareCustomerRewardPointsAsync(int? page);
}