package net.vulkanmod.vulkan.texture;

import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.textures.GpuTextureView;
import java.nio.ByteBuffer;
import net.vulkanmod.Initializer;
import net.vulkanmod.gl.VkGlTexture;
import net.vulkanmod.render.engine.VkGpuTexture;
import net.vulkanmod.render.texture.SpriteUpdateUtil;
import net.vulkanmod.vulkan.shader.Pipeline;
import net.vulkanmod.vulkan.shader.descriptor.ImageDescriptor;
import org.lwjgl.system.MemoryUtil;

public abstract class VTextureSelector {
   public static final int SIZE = 12;
   private static final VulkanImage[] boundTextures = new VulkanImage[12];
   private static final int[] levels = new int[12];
   private static final VulkanImage whiteTexture = VulkanImage.createWhiteTexture();
   private static int activeTexture = 0;

   public static void bindTexture(VulkanImage texture) {
      boundTextures[0] = texture;
   }

   public static void bindTexture(int i, VulkanImage texture) {
      if (i >= 0 && i < 12) {
         boundTextures[i] = texture;
         levels[i] = -1;
      } else {
         Initializer.LOGGER.error(String.format("On Texture binding: index %d out of range [0, %d]", i, 11));
      }
   }

   public static void bindImage(int i, VulkanImage texture, int level) {
      if (i >= 0 && i <= 7) {
         boundTextures[i] = texture;
         levels[i] = level;
      } else {
         Initializer.LOGGER.error(String.format("On Texture binding: index %d out of range [0, %d]", i, 11));
      }
   }

   public static void uploadSubTexture(int mipLevel, int width, int height, int xOffset, int yOffset, int unpackSkipRows, int unpackSkipPixels, int unpackRowLength, ByteBuffer buffer) {
      uploadSubTexture(mipLevel, 0, width, height, xOffset, yOffset, unpackSkipRows, unpackSkipPixels, unpackRowLength, MemoryUtil.memAddress(buffer));
   }

   public static void uploadSubTexture(int mipLevel, int arrayLayer, int width, int height, int xOffset, int yOffset, int unpackSkipRows, int unpackSkipPixels, int unpackRowLength, long bufferPtr) {
      VulkanImage texture = boundTextures[activeTexture];
      if (texture == null) {
         throw new NullPointerException("Texture is null at index: " + activeTexture);
      } else {
         SpriteUpdateUtil.addTransitionedLayout(texture);
         texture.uploadSubTextureAsync(mipLevel, arrayLayer, width, height, xOffset, yOffset, unpackSkipRows, unpackSkipPixels, unpackRowLength, bufferPtr);
      }
   }

   public static int getTextureIdx(String name) {
      byte var10000;
      switch (name) {
         case "Sampler0":
         case "DiffuseSampler":
         case "InSampler":
         case "CloudFaces":
            var10000 = 0;
            break;
         case "Sampler1":
         case "BlurSampler":
            var10000 = 1;
            break;
         case "Sampler2":
            var10000 = 2;
            break;
         case "Sampler3":
            var10000 = 3;
            break;
         case "Sampler4":
            var10000 = 4;
            break;
         case "Sampler5":
            var10000 = 5;
            break;
         case "Sampler6":
            var10000 = 6;
            break;
         case "Sampler7":
            var10000 = 7;
            break;
         default:
            var10000 = -1;
      }

      return var10000;
   }

   public static void bindShaderTextures(Pipeline pipeline) {
      for(ImageDescriptor state : pipeline.getImageDescriptors()) {
         GpuTextureView textureView = RenderSystem.getShaderTexture(state.imageIdx);
         if (textureView != null) {
            VkGpuTexture gpuTexture = (VkGpuTexture)textureView.texture();
            gpuTexture.flushModeChanges();
            int shaderTexture = gpuTexture.method_68427();
            VkGlTexture texture = VkGlTexture.getTexture(shaderTexture);
            if (texture != null && texture.getVulkanImage() != null) {
               bindTexture(state.imageIdx, texture.getVulkanImage());
            }
         }
      }

   }

   public static VulkanImage getImage(int i) {
      return boundTextures[i];
   }

   public static void setLightTexture(VulkanImage texture) {
      boundTextures[2] = texture;
   }

   public static void setOverlayTexture(VulkanImage texture) {
      boundTextures[1] = texture;
   }

   public static void setActiveTexture(int activeTexture) {
      if (activeTexture < 0 || activeTexture >= 12) {
         Initializer.LOGGER.error(String.format("On Texture binding: index %d out of range [0, %d]", activeTexture, 11));
      }

      VTextureSelector.activeTexture = activeTexture;
   }

   public static VulkanImage getBoundTexture() {
      return boundTextures[activeTexture];
   }

   public static VulkanImage getBoundTexture(int i) {
      return boundTextures[i];
   }

   public static VulkanImage getWhiteTexture() {
      return whiteTexture;
   }
}
