using DomainResults.Common;
using DataProviders;
using DataProviders.Buckets;
using DataProviders.Collections;
using ImageProvider;
using ImageProvider.Fonts;
using Core.Abstractions;
namespace WeatherForecast.Services {
  /// 
  /// 
  /// 
  public interface IImageService {
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    (BucketFile?, IDomainResult) Get(Guid siteId, int width, int height, Guid imageId);
  }
  /// 
  /// 
  /// 
  public class ImageService : ServiceBase, IImageService {
    private readonly IImageBucketDataProvider _imageBucketDataProvider;
    private readonly IImageProvider _imageProvider;
    private readonly IContentDataProvider _contentDataProvider;
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    public ImageService(
      ILogger logger,
      IImageBucketDataProvider imageBucketDataProvider,
      IImageProvider imageProvider,
      IContentDataProvider contentDataProvider
    ) : base(logger) {
      _imageBucketDataProvider = imageBucketDataProvider;
      _imageProvider = imageProvider;
      _contentDataProvider = contentDataProvider;
    }
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    public (BucketFile?, IDomainResult) Get(Guid siteId, int width, int height, Guid imageId) {
      try {
        var (file, downloadResult) = _imageBucketDataProvider.Download(siteId, imageId);
        if (!downloadResult.IsSuccess || file == null)
          return IDomainResult.Failed ();
        var (content, getContentResult) = _contentDataProvider.Get(siteId);
        if (!getContentResult.IsSuccess || content == null)
          return IDomainResult.Failed();
        var (image, transformResult) = _imageProvider.ResizeAndWatermark(file.Bytes, width, height, FontsEnum.Montserrat, FontStylesEnum.Regular, content.First().SiteName);
        if (!transformResult.IsSuccess || image == null)
          return IDomainResult.Failed();
        return IDomainResult.Success(new BucketFile(file.Name, image, "image/jpeg"));
      }
      catch (Exception ex) {
        _logger.LogError(ex, "Unhandled exception");
        return IDomainResult.Failed (ex.Message);
      }
    }
  }
}