using DomainResults.Common;
using DataProviders;
using DataProviders.Buckets;
using Core.Abstractions;
namespace WeatherForecast.Services {
  /// 
  /// 
  /// 
  public interface IFileService {
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    (Guid?, IDomainResult) Post(Guid siteId, Guid userId, IFormFile file);
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    (BucketFile?, IDomainResult) Get(Guid siteId, Guid userId, Guid fileId);
    
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    IDomainResult Delete(Guid siteId, Guid userId, Guid fileId);
  }
  /// 
  /// 
  /// 
  public class FileService : ServiceBase, IFileService {
    private readonly IFilesService _filesService;
    private readonly IImageBucketDataProvider _imageBucketDataProvider;
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    public FileService(
      ILogger logger,
      IFilesService filesService,
      IImageBucketDataProvider imageBucketDataProvider
    ) : base(logger) {
      _filesService = filesService;
      _imageBucketDataProvider = imageBucketDataProvider;
    }
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    public (Guid?, IDomainResult) Post(Guid siteId, Guid userId, IFormFile file) {
      var (list, result) = _filesService.Post(siteId, userId, new List { file });
      if (!result.IsSuccess || list == null)
        return (null, result);
      return (list.First(), result);
    }
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    public (BucketFile?, IDomainResult) Get(Guid siteId, Guid userId, Guid fileId) {
      try {
        var (file, result) = _imageBucketDataProvider.Download(siteId, userId, fileId);
        if (!result.IsSuccess || file == null)
          return (null, result);
        return IDomainResult.Success(file);
      }
      catch (Exception ex) {
        _logger.LogError(ex, "Unhandled exception");
        return IDomainResult.Failed(ex.Message);
      }
    }
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    public IDomainResult Delete(Guid siteId, Guid userId, Guid fileId) {
      try {
        return _imageBucketDataProvider.DeleteOne(siteId, userId, fileId);
      }
      catch (Exception ex) {
        _logger.LogError(ex, "Unhandled exception");
        return IDomainResult.Failed(ex.Message);
      }
    }
  }
}