using Grand.Business.Core.Interfaces.Catalog.Discounts;
using Grand.Domain.Catalog;
using Grand.Domain.Discounts;
using Grand.Domain.Vendors;
using Grand.Web.Admin.Models.Catalog;
using Grand.Web.Admin.Models.Discounts;

namespace Grand.Web.Admin.Interfaces;

public interface IDiscountViewModelService
{
    DiscountListModel PrepareDiscountListModel();

    Task<(IEnumerable<DiscountModel> discountModel, int totalCount)> PrepareDiscountModel(DiscountListModel model,
        int pageIndex, int pageSize);

    Task PrepareDiscountModel(DiscountModel model, Discount discount);
    Task<Discount> InsertDiscountModel(DiscountModel model);
    Task<Discount> UpdateDiscountModel(Discount discount, DiscountModel model);
    Task DeleteDiscount(Discount discount);
    Task InsertCouponCode(string discountId, string couponCode);

    string GetRequirementUrlInternal(IDiscountRule discountRequirementRule, Discount discount,
        string discountRequirementId);

    Task DeleteDiscountRequirement(DiscountRule discountRequirement, Discount discount);
    Task<DiscountModel.AddProductToDiscountModel> PrepareProductToDiscountModel();

    Task<(IList<ProductModel> products, int totalCount)> PrepareProductModel(
        DiscountModel.AddProductToDiscountModel model, int pageIndex, int pageSize);

    Task InsertProductToDiscountModel(DiscountModel.AddProductToDiscountModel model);
    Task DeleteProduct(Discount discount, Product product);
    Task DeleteCategory(Discount discount, Category category);
    Task DeleteBrand(Discount discount, Brand brand);
    Task DeleteVendor(Discount discount, Vendor vendor);
    Task DeleteCollection(Discount discount, Collection collection);
    Task InsertCategoryToDiscountModel(DiscountModel.AddCategoryToDiscountModel model);
    Task InsertBrandToDiscountModel(DiscountModel.AddBrandToDiscountModel model);
    Task InsertCollectionToDiscountModel(DiscountModel.AddCollectionToDiscountModel model);
    Task InsertVendorToDiscountModel(DiscountModel.AddVendorToDiscountModel model);

    Task<(IEnumerable<DiscountModel.DiscountUsageHistoryModel> usageHistoryModels, int totalCount)>
        PrepareDiscountUsageHistoryModel(Discount discount, int pageIndex, int pageSize);
}