using SixLabors.Fonts;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.Formats.Gif;
using SixLabors.ImageSharp.Formats.Jpeg;
using SixLabors.ImageSharp.Formats.Pbm;
using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.Formats.Tga;
using SixLabors.ImageSharp.Formats.Tiff;
using SixLabors.ImageSharp.Formats.Webp;
using SixLabors.ImageSharp.Processing;
using ImageProvider.Extensions;
namespace ImageProvider {
  public class ImageBuilder : IDisposable {
    private Image _image;
    /// 
    /// 
    /// 
    /// 
    public ImageBuilder(byte[] bytes) {
      _image = Image.Load(bytes);
    }
    public void Load(byte[] bytes) {
      _image = Image.Load(bytes);
    }
    /// 
    /// 
    /// 
    ///  for scaling water mark size is largely ignored.
    /// 
    public void Watermark(Font font, string text) =>
      _image = _image.Clone(ctx => ctx.ApplyScalingWaterMark(font, text, Color.HotPink, 5, false));
    /// 
    /// 
    /// 
    ///  for scaling water mark size is largely ignored.
    /// 
    public void WatermarkWordWrap(Font font, string longText) =>
      _image = _image.Clone(ctx => ctx.ApplyScalingWaterMark(font, longText, Color.HotPink, 5, true));
    /// 
    /// 
    /// 
    /// 
    /// 
    public void Resize(int width, int height) =>
      _image.Mutate(img => img.Resize(width, height));
    public void FitWidthResize(int width) {
      _image.Mutate(x => x.Resize(new ResizeOptions {
        Size = new Size(width, width),
        Mode = ResizeMode.Max
      }));
    }
    public void FitHeightResize(int height) {
      _image.Mutate(x => x.Resize(new ResizeOptions {
        Size = new Size(height, height),
        Mode = ResizeMode.Max
      }));
    }
    public void Crop(int cWidth, int cHeigth) =>
      Crop((_image.Width - cWidth) / 2, (_image.Height - cHeigth) / 2, cWidth, cHeigth);
    public void Crop(int x, int y, int cWidth, int cHeigth) =>
      _image.Mutate(img => img.Crop(new Rectangle(x, y, cWidth, cHeigth)));
    private byte[] Buid(IImageEncoder encoder) {
      using var ms = new MemoryStream();
      _image.Save(ms, encoder);
      return ms.ToArray();
    }
    public byte[] ToGif() => Buid(new GifEncoder());
    public byte[] ToJpeg() => Buid(new JpegEncoder());
    public byte[] ToPbm() => Buid(new PbmEncoder());
    public byte[] ToPng() => Buid(new PngEncoder());
    public byte[] ToTga() => Buid(new TgaEncoder());
    public byte[] ToTiff() => Buid(new TiffEncoder());
    public byte[] ToWebp() => Buid(new WebpEncoder());
    public void Dispose() => _image.Dispose();
  }
}