package net.minecraft.client.renderer.entity.layers;

import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import java.util.Optional;
import java.util.function.Consumer;
import net.minecraft.client.model.ParrotModel;
import net.minecraft.client.model.PlayerModel;
import net.minecraft.client.model.geom.EntityModelSet;
import net.minecraft.client.model.geom.ModelLayers;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.entity.ParrotRenderer;
import net.minecraft.client.renderer.entity.RenderLayerParent;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.animal.Parrot;
import net.minecraft.world.entity.animal.Parrot.Variant;
import net.minecraft.world.entity.player.Player;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.transformer.meta.MixinMerged;
import traben.entity_texture_features.features.ETFRenderContext;
import traben.entity_texture_features.features.state.ETFEntityRenderState;
import traben.entity_texture_features.utils.ETFEntity;

public class ParrotOnShoulderLayer<T extends Player> extends RenderLayer<T, PlayerModel<T>> {
   private final ParrotModel model;
   @Unique
   @MixinMerged(
      mixin = "traben.entity_texture_features.mixin.mixins.entity.renderer.feature.MixinShoulderParrotFeatureRenderer",
      priority = 1000,
      sessionId = "aa7516ed-ea5d-4cc7-8bd3-830fe31dd1ea"
   )
   private ETFEntityRenderState etf$heldEntity = null;

   public ParrotOnShoulderLayer(RenderLayerParent<T, PlayerModel<T>> p_174511_, EntityModelSet p_174512_) {
      super(p_174511_);
      this.model = new ParrotModel(p_174512_.bakeLayer(ModelLayers.PARROT));
   }

   public void render(
      PoseStack p_117307_,
      MultiBufferSource p_117308_,
      int p_117309_,
      T p_117310_,
      float p_117311_,
      float p_117312_,
      float p_117313_,
      float p_117314_,
      float p_117315_,
      float p_117316_
   ) {
      this.render(p_117307_, p_117308_, p_117309_, p_117310_, p_117311_, p_117312_, p_117315_, p_117316_, true);
      this.render(p_117307_, p_117308_, p_117309_, p_117310_, p_117311_, p_117312_, p_117315_, p_117316_, false);
   }

   private void render(
      PoseStack p_117318_,
      MultiBufferSource p_117319_,
      int p_117320_,
      T p_117321_,
      float p_117322_,
      float p_117323_,
      float p_117324_,
      float p_117325_,
      boolean p_117326_
   ) {
      CompoundTag $$9 = p_117326_ ? p_117321_.getShoulderEntityLeft() : p_117321_.getShoulderEntityRight();
      Optional var10000 = EntityType.byString($$9.getString("id")).filter(p_117294_ -> p_117294_ == EntityType.PARROT);
      Consumer injectorAllocatedLocal11 = p_262538_ -> {
         p_117318_.pushPose();
         p_117318_.translate(p_117326_ ? 0.4F : -0.4F, p_117321_.isCrouching() ? -1.3F : -1.5F, 0.0F);
         Variant $$11 = Variant.byId($$9.getInt("Variant"));
         VertexConsumer $$12 = p_117319_.getBuffer(this.model.renderType(ParrotRenderer.getVariantTexture($$11)));
         this.model.renderOnShoulder(p_117318_, $$12, p_117320_, OverlayTexture.NO_OVERLAY, p_117322_, p_117323_, p_117324_, p_117325_, p_117321_.tickCount);
         p_117318_.popPose();
      };
      var10000.ifPresent(this.modify$zhb000$entity_texture_features$etf$alterEntity(injectorAllocatedLocal11, p_117321_, $$9));
   }

   @MixinMerged(
      mixin = "traben.entity_texture_features.mixin.mixins.entity.renderer.feature.MixinShoulderParrotFeatureRenderer",
      priority = 1000,
      sessionId = "aa7516ed-ea5d-4cc7-8bd3-830fe31dd1ea"
   )
   private Consumer modify$zhb000$entity_texture_features$etf$alterEntity(Consumer action, Player t, CompoundTag nbtCompound) {
      return v -> {
         this.etf$HEADalterEntity(t, nbtCompound);
         action.accept(v);
         this.etf$TAILresetEntity();
      };
   }

   @Unique
   @MixinMerged(
      mixin = "traben.entity_texture_features.mixin.mixins.entity.renderer.feature.MixinShoulderParrotFeatureRenderer",
      priority = 1000,
      sessionId = "aa7516ed-ea5d-4cc7-8bd3-830fe31dd1ea"
   )
   private void etf$HEADalterEntity(Player playerEntity, CompoundTag nbtCompound) {
      if (nbtCompound != null) {
         this.etf$heldEntity = ETFRenderContext.getCurrentEntityState();
         Optional optionalEntity = EntityType.create(nbtCompound, playerEntity.level());
         if (optionalEntity.isPresent() && optionalEntity.get() instanceof Parrot parrot) {
            ETFRenderContext.setCurrentEntity(ETFEntityRenderState.forEntity((ETFEntity)parrot));
         }
      }
   }

   @Unique
   @MixinMerged(
      mixin = "traben.entity_texture_features.mixin.mixins.entity.renderer.feature.MixinShoulderParrotFeatureRenderer",
      priority = 1000,
      sessionId = "aa7516ed-ea5d-4cc7-8bd3-830fe31dd1ea"
   )
   private void etf$TAILresetEntity() {
      if (this.etf$heldEntity != null) {
         ETFRenderContext.setCurrentEntity(this.etf$heldEntity);
      }

      this.etf$heldEntity = null;
   }
}
