using Grand.Domain.Common;
using Grand.Domain.Customers;
using Grand.Domain.Orders;
using Grand.Web.Admin.Models.Catalog;
using Grand.Web.Admin.Models.Common;
using Grand.Web.Admin.Models.Customers;
using Grand.Web.Admin.Models.Messages;
using Grand.Web.Admin.Models.ShoppingCart;

namespace Grand.Web.Admin.Interfaces;

public interface ICustomerViewModelService
{
    Task<CustomerListModel> PrepareCustomerListModel();

    Task<(IEnumerable<CustomerModel> customerModelList, int totalCount)> PrepareCustomerList(CustomerListModel model,
        string[] searchCustomerGroupIds, string[] searchCustomerTagIds, int pageIndex, int pageSize);

    Task PrepareCustomerModel(CustomerModel model, Customer customer, bool excludeProperties);
    Task<Customer> InsertCustomerModel(CustomerModel model);
    Task<Customer> UpdateCustomerModel(Customer customer, CustomerModel model);
    Task DeleteCustomer(Customer customer);
    Task DeleteSelected(IEnumerable<string> selectedIds);
    Task SendEmail(Customer customer, CustomerModel.SendEmailModel model);
    Task<IEnumerable<CustomerModel.LoyaltyPointsHistoryModel>> PrepareLoyaltyPointsHistoryModel(string customerId);

    Task<LoyaltyPointsHistory> InsertLoyaltyPointsHistory(Customer customer, string storeId, int addLoyaltyPointsValue,
        string addLoyaltyPointsMessage);

    Task<IEnumerable<AddressModel>> PrepareAddressModel(Customer customer);
    Task DeleteAddress(Customer customer, Address address);
    Task PrepareAddressModel(CustomerAddressModel model, Address address, Customer customer, bool excludeProperties);

    Task<Address> InsertAddressModel(Customer customer, CustomerAddressModel model,
        List<CustomAttribute> customAttributes);

    Task<Address> UpdateAddressModel(Customer customer, Address address, CustomerAddressModel model,
        List<CustomAttribute> customAttributes);

    Task<IList<ShoppingCartItemModel>> PrepareShoppingCartItemModel(string customerId, int cartTypeId);
    Task DeleteCart(Customer customer, string id);
    Task<IList<string>> UpdateCart(Customer customer, string shoppingCartId, double? unitprice);

    Task<(IEnumerable<CustomerModel.ProductPriceModel> productPriceModels, int totalCount)> PrepareProductPriceModel(
        string customerId, int pageIndex, int pageSize);

    Task<(IEnumerable<CustomerModel.ProductModel> productModels, int totalCount)> PreparePersonalizedProducts(
        string customerId, int pageIndex, int pageSize);

    Task<CustomerModel.AddProductModel> PrepareCustomerModelAddProductModel();

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

    Task InsertCustomerAddProductModel(string customerId, bool personalized, CustomerModel.AddProductModel model);
    Task UpdateProductPrice(CustomerModel.ProductPriceModel model);
    Task DeleteProductPrice(string id);
    Task UpdatePersonalizedProduct(CustomerModel.ProductModel model);
    Task DeletePersonalizedProduct(string id);

    Task<(IEnumerable<ContactFormModel> contactFormModels, int totalCount)> PrepareContactFormModel(string customerId,
        int pageIndex, int pageSize);

    Task<(IEnumerable<CustomerModel.OutOfStockSubscriptionModel> outOfStockSubscriptionModels, int totalCount)>
        PrepareOutOfStockSubscriptionModel(string customerId, int pageIndex, int pageSize);

    Task<IList<CustomerModel.CustomerNote>> PrepareCustomerNoteList(string customerId);

    Task<CustomerNote> InsertCustomerNote(string customerId, string downloadId, bool displayToCustomer, string title,
        string message);

    Task DeleteCustomerNote(string id, string customerId);
}