using Minint.Core.Models;

namespace Minint.Core.Services.Impl;

public sealed class DrawingService : IDrawingService
{
    public void ApplyBrush(MinintLayer layer, int cx, int cy, int radius, int colorIndex, int width, int height)
    {
        foreach (var (x, y) in GetBrushMask(cx, cy, radius, width, height))
            layer.Pixels[y * width + x] = colorIndex;
    }

    public void ApplyEraser(MinintLayer layer, int cx, int cy, int radius, int width, int height)
    {
        foreach (var (x, y) in GetBrushMask(cx, cy, radius, width, height))
            layer.Pixels[y * width + x] = 0;
    }

    public List<(int X, int Y)> GetBrushMask(int cx, int cy, int radius, int width, int height)
    {
        var mask = new List<(int, int)>();
        int r = Math.Max(radius, 0);
        int r2 = r * r;

        int xMin = Math.Max(0, cx - r);
        int xMax = Math.Min(width - 1, cx + r);
        int yMin = Math.Max(0, cy - r);
        int yMax = Math.Min(height - 1, cy + r);

        for (int py = yMin; py <= yMax; py++)
        {
            int dy = py - cy;
            for (int px = xMin; px <= xMax; px++)
            {
                int dx = px - cx;
                if (dx * dx + dy * dy <= r2)
                    mask.Add((px, py));
            }
        }

        return mask;
    }
}
