using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Toolbox.Library
{
    //
    // A class which can create generic texture instances from bitmaps for usage in opengl and image editors.
    //
    public class GenericBitmapTexture : STGenericTexture
    {
        public override bool CanEdit { get; set; } = true;

        public override TEX_FORMAT[] SupportedFormats
        {
            get
            {
                return new TEX_FORMAT[] { TEX_FORMAT.R8G8B8A8_UNORM };
            }
        }

        public byte[] ImageData;

        public GenericBitmapTexture(byte[] FileData, int width, int height)
        {
            Format = TEX_FORMAT.R8G8B8A8_UNORM;
            Width = (uint)width;
            Height = (uint)height;

            ImageData = DDSCompressor.CompressBlock(FileData, width, height,
                DDS.DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, false);
        }

        public GenericBitmapTexture(string FileName) {
            LoadBitmap(new Bitmap(FileName));
        }

        public GenericBitmapTexture(Bitmap Image) {
            LoadBitmap(Image);
        }

        private void LoadBitmap(Bitmap Image)
        {
            Image = BitmapExtension.SwapBlueRedChannels(Image);

            Format = TEX_FORMAT.R8G8B8A8_UNORM;
            Width = (uint)Image.Width;
            Height = (uint)Image.Height;
            MipCount = 1;

            ImageData = GenerateMipsAndCompress(Image, MipCount, Format);

            if (ImageData == null || ImageData.Length <= 0)
                throw new Exception("Image failed to encode!");
        }

        public override void SetImageData(Bitmap bitmap, int ArrayLevel)
        {
            byte[] Data = BitmapExtension.ImageToByte(bitmap);
            Width = (uint)bitmap.Width;
            Height = (uint)bitmap.Height;

            ImageData = DDSCompressor.EncodePixelBlock(Data, bitmap.Width, bitmap.Width, DDS.DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM_SRGB);
        }

        public override byte[] GetImageData(int ArrayLevel = 0, int MipLevel = 0, int DepthLevel = 0)
        {
            return ImageData;
        }
    }
}
