using Ryujinx.Graphics.GAL;
using System.Runtime.Versioning;

namespace Ryujinx.Graphics.Metal
{
    [SupportedOSPlatform("macos")]
    internal class ImageArray : IImageArray
    {
        private readonly TextureRef[] _textureRefs;
        private readonly TextureBuffer[] _bufferTextureRefs;

        private readonly bool _isBuffer;
        private readonly Pipeline _pipeline;

        public ImageArray(int size, bool isBuffer, Pipeline pipeline)
        {
            if (isBuffer)
            {
                _bufferTextureRefs = new TextureBuffer[size];
            }
            else
            {
                _textureRefs = new TextureRef[size];
            }

            _isBuffer = isBuffer;
            _pipeline = pipeline;
        }

        public void SetImages(int index, ITexture[] images)
        {
            for (int i = 0; i < images.Length; i++)
            {
                ITexture image = images[i];

                if (image is TextureBuffer textureBuffer)
                {
                    _bufferTextureRefs[index + i] = textureBuffer;
                }
                else if (image is Texture texture)
                {
                    _textureRefs[index + i].Storage = texture;
                }
                else if (!_isBuffer)
                {
                    _textureRefs[index + i].Storage = null;
                }
                else
                {
                    _bufferTextureRefs[index + i] = null;
                }
            }

            SetDirty();
        }

        public TextureRef[] GetTextureRefs()
        {
            return _textureRefs;
        }

        public TextureBuffer[] GetBufferTextureRefs()
        {
            return _bufferTextureRefs;
        }

        private void SetDirty()
        {
            _pipeline.DirtyImages();
        }

        public void Dispose() { }
    }
}
