using OpenNest.Geometry;
using OpenNest.Math;

namespace OpenNest.RectanglePacking
{
    internal class FillNoRotation : FillEngine
    {
        public FillNoRotation(Bin bin)
            : base(bin)
        {
        }

        public NestDirection NestDirection { get; set; }

        public override void Fill(Item item)
        {
            var ycount = (int)System.Math.Floor((Bin.Width + Tolerance.Epsilon) / item.Width);
            var xcount = (int)System.Math.Floor((Bin.Length + Tolerance.Epsilon) / item.Length);

            for (int i = 0; i < xcount; i++)
            {
                var x = item.Length * i + Bin.X;

                for (int j = 0; j < ycount; j++)
                {
                    var y = item.Width * j + Bin.Y;

                    var addedItem = item.Clone() as Item;
                    addedItem.Location = new Vector(x, y);

                    Bin.Items.Add(addedItem);
                }
            }
        }

        public override void Fill(Item item, int maxCount)
        {
            var ycount = (int)System.Math.Floor((Bin.Width + Tolerance.Epsilon) / item.Width);
            var xcount = (int)System.Math.Floor((Bin.Length + Tolerance.Epsilon) / item.Length);
            var count = ycount * xcount;

            if (count <= maxCount)
            {
                Fill(item);
                return;
            }

            var columns = 0;
            var rows = 0;

            if (NestDirection == NestDirection.Vertical)
            {
                columns = (int)System.Math.Ceiling((double)maxCount / ycount);
                rows = (int)System.Math.Ceiling((double)maxCount / columns);
            }
            else
            {
                rows = (int)System.Math.Ceiling((double)maxCount / xcount);
                columns = (int)System.Math.Ceiling((double)maxCount / rows);
            }

            Bin.Items.AddRange(FillGrid(item, rows, columns, maxCount, columnMajor: item.Width > item.Length));
        }
    }
}
