package net.vulkanmod.mixin.render.frapi;

import java.util.List;
import net.fabricmc.fabric.api.renderer.v1.render.FabricLayerRenderState;
import net.minecraft.class_10444;
import net.minecraft.class_11659;
import net.minecraft.class_1921;
import net.minecraft.class_4587;
import net.minecraft.class_777;
import net.minecraft.class_811;
import net.vulkanmod.render.chunk.build.frapi.accessor.AccessLayerRenderState;
import net.vulkanmod.render.chunk.build.frapi.accessor.AccessRenderCommandQueue;
import net.vulkanmod.render.chunk.build.frapi.mesh.MutableMeshImpl;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin({class_10444.class_10446.class})
abstract class ItemRenderStateLayerRenderStateM implements FabricLayerRenderState, AccessLayerRenderState {
   @Unique
   private final MutableMeshImpl mutableMesh = new MutableMeshImpl();

   @Inject(
      method = {"method_65612"},
      at = {@At("RETURN")}
   )
   private void onReturnClear(CallbackInfo ci) {
      this.mutableMesh.clear();
   }

   @Redirect(
      method = {"method_65614"},
      at = @At(
   value = "INVOKE",
   target = "Lnet/minecraft/class_11659;method_73480(Lnet/minecraft/class_4587;Lnet/minecraft/class_811;III[ILjava/util/List;Lnet/minecraft/class_1921;Lnet/minecraft/class_10444$class_10445;)V"
)
   )
   private void submitItemProxy(class_11659 commandQueue, class_4587 matrices, class_811 displayContext, int light, int overlay, int outlineColor, int[] tints, List<class_777> quads, class_1921 layer, class_10444.class_10445 glint) {
      if (this.mutableMesh.size() > 0 && commandQueue instanceof AccessRenderCommandQueue access) {
         access.submitItem(matrices, displayContext, light, overlay, outlineColor, tints, quads, layer, glint, this.mutableMesh);
      } else {
         commandQueue.method_73480(matrices, displayContext, light, overlay, outlineColor, tints, quads, layer, glint);
      }

   }

   public MutableMeshImpl getMutableMesh() {
      return this.mutableMesh;
   }
}
