using DomainResults.Common;
using DataProviders.Collections;
using Core.Abstractions;
using WeatherForecast.Models.Responses;
using WeatherForecast.Models.Shop.Requests;
using DomainObjects.Documents;
using DomainObjects.Enumerations;
namespace WeatherForecast.Services;
/// 
/// 
/// 
public interface IShopCartItemService {
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  (Guid?, IDomainResult) Post(Guid siteId, Guid userId, string sku, ShopCartItemRequestModel requestModel);
    
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  (ShopCartItemResponseModel?, IDomainResult) Get(ShopCartDocument cartItem, string? locale);
    
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  (Guid?, IDomainResult) Update(ShopCartDocument cartItem, ShopCartItemRequestModel requestData);
}
/// 
/// 
/// 
public class ShopCartItemService : ServiceBase, IShopCartItemService {
  private readonly IShopCatalogDataProvider _shopCatalogDataProvider;
  private readonly IShopCartDataProvider _shopCartDataProvider;
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  public ShopCartItemService(
    ILogger logger,
    IShopCatalogDataProvider shopCatalogDataProvider,
    IShopCartDataProvider shopCartDataprovider
  ) : base(logger) {
    _shopCatalogDataProvider = shopCatalogDataProvider;
    _shopCartDataProvider = shopCartDataprovider;
  }
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  public (Guid?, IDomainResult) Post(Guid siteId, Guid userId, string sku, ShopCartItemRequestModel requestModel) {
      var (_, getResult) = _shopCartDataProvider.Get(siteId, userId, sku);
      if (getResult.IsSuccess)
        return IDomainResult.Failed();
      var item = requestModel.ToDomainObject();
      item.SiteId = siteId;
      item.UserId = userId;
      item.Sku = sku;
      var (id, insertResult) = _shopCartDataProvider.Insert(item);
      if (!insertResult.IsSuccess)
        return IDomainResult.Failed();
      return IDomainResult.Success(id);
  }
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  public (ShopCartItemResponseModel?, IDomainResult) Get(ShopCartDocument cartItem, string? locale) {
      var (item, result) = _shopCatalogDataProvider.Get(cartItem.SiteId, cartItem.Sku);
      if (!result.IsSuccess || item == null) {
        var delteResult = _shopCartDataProvider.Delete(cartItem.Id);
        if (!delteResult.IsSuccess)
          return (null, delteResult);
        return IDomainResult.NotFound();
      }
      else
        return IDomainResult.Success(new ShopCartItemResponseModel(item, cartItem, Enumeration.FromDisplayName(locale ?? "en-US")));
    
  }
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  public (Guid?, IDomainResult) Update(ShopCartDocument cartItem, ShopCartItemRequestModel requestData) {
      // construct domain object from model
      var newItem = requestData.ToDomainObject();
      newItem.Id = cartItem.Id;
      newItem.SiteId = cartItem.SiteId;
      newItem.UserId = cartItem.UserId;
      newItem.Sku = cartItem.Sku;
      newItem.Created = cartItem.Created;
      if (!cartItem.Equals(newItem)) {
        var (id, updateResult) = _shopCartDataProvider.Update(newItem);
        if (!updateResult.IsSuccess || id == null)
          return (null, updateResult);
      }
      return IDomainResult.Success(cartItem.Id);
  }
}