using Grand.Domain;
using Grand.Domain.Customers;

namespace Grand.Business.Core.Interfaces.Marketing.Customers
{
    /// <summary>
    /// Customer product service interface
    /// </summary>
    public interface ICustomerProductService
    {
        #region Customer Product Price

        /// <summary>
        /// Gets a customer product price
        /// </summary>
        /// <param name="id">Identifier</param>
        /// <returns>Customer product price</returns>
        Task<CustomerProductPrice> GetCustomerProductPriceById(string id);

        /// <summary>
        /// Gets a price
        /// </summary>
        /// <param name="customerId">Customer Identifier</param>
        /// <param name="productId">Product Identifier</param>
        /// <returns>Customer product price</returns>
        Task<double?> GetPriceByCustomerProduct(string customerId, string productId);

        /// <summary>
        /// Gets a customer product 
        /// </summary>
        /// <param name="id">Identifier</param>
        /// <returns>Customer product</returns>
        Task<CustomerProduct> GetCustomerProduct(string id);

        /// <summary>
        /// Gets a customer product 
        /// </summary>
        /// <param name="customerId">Customer Identifier</param>
        /// <param name="productId">Product Identifier</param>
        /// <returns>Customer product</returns>
        Task<CustomerProduct> GetCustomerProduct(string customerId, string productId);

        /// <summary>
        /// Inserts a customer product price
        /// </summary>
        /// <param name="customerProductPrice">Customer product price</param>
        Task InsertCustomerProductPrice(CustomerProductPrice customerProductPrice);

        /// <summary>
        /// Updates the customer product price
        /// </summary>
        /// <param name="customerProductPrice">Customer product price</param>
        Task UpdateCustomerProductPrice(CustomerProductPrice customerProductPrice);

        /// <summary>
        /// Delete a customer product price
        /// </summary>
        /// <param name="customerProductPrice">Customer product price</param>
        Task DeleteCustomerProductPrice(CustomerProductPrice customerProductPrice);


        /// <summary>
        /// Gets products price for customer
        /// </summary>
        /// <param name="customerId">Customer id</param>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <returns>Customer products price</returns>
        Task<IPagedList<CustomerProductPrice>> GetProductsPriceByCustomer(string customerId, int pageIndex = 0, int pageSize = int.MaxValue);

        #endregion

        #region Customer product

        /// <summary>
        /// Inserts a customer product 
        /// </summary>
        /// <param name="customerProduct">Customer product</param>
        Task InsertCustomerProduct(CustomerProduct customerProduct);

        /// <summary>
        /// Updates the customer product
        /// </summary>
        /// <param name="customerProduct">Customer product </param>
        Task UpdateCustomerProduct(CustomerProduct customerProduct);

        /// <summary>
        /// Delete a customer product 
        /// </summary>
        /// <param name="customerProduct">Customer product </param>
        Task DeleteCustomerProduct(CustomerProduct customerProduct);

        Task<IPagedList<CustomerProduct>> GetProductsByCustomer(string customerId, int pageIndex = 0, int pageSize = int.MaxValue);

        #endregion
    }
}
