/*
 * Derived from Epic Fight (https://github.com/Epic-Fight/epicfight)
 * by the Epic Fight Team, licensed under GPLv3.
 * Modifications © 2026 TiedUp! Remake Contributors, distributed under GPLv3.
 */

package com.tiedup.remake.rig.render;

import com.mojang.blaze3d.vertex.PoseStack;

import net.minecraft.client.model.EntityModel;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.entity.layers.RenderLayer;
import net.minecraft.world.entity.LivingEntity;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;

import com.tiedup.remake.rig.math.OpenMatrix4f;
import com.tiedup.remake.rig.patch.LivingEntityPatch;

/**
 * Base abstraite pour les layers additionnels (armor, item-in-hand, cape...)
 * rendus par dessus le mesh principal. Équivalent EF
 * {@code client.renderer.patched.layer.PatchedLayer}.
 *
 * <p><b>RIG Phase 2.5</b> : infrastructure minimale — la méthode
 * {@link #renderLayer} est no-op par défaut, et les 2 sous-classes concrètes
 * (armor / item-in-hand) sont stubs. Implémentations réelles en Phase 3
 * (V3-REW-04 armor, V3-REW-08/09 cape/arrows).</p>
 *
 * @param <E>  entité vanilla
 * @param <T>  patch RIG de {@code E}
 * @param <M>  EntityModel vanilla
 * @param <L>  RenderLayer vanilla concret (ex. {@code HumanoidArmorLayer})
 */
@OnlyIn(Dist.CLIENT)
public abstract class PatchedLayer<E extends LivingEntity, T extends LivingEntityPatch<E>, M extends EntityModel<E>, L extends RenderLayer<E, M>> {

	/**
	 * Méthode appelée par {@link PatchedLivingEntityRenderer#renderLayer} pour
	 * chaque layer patché enregistré. Stub no-op par défaut.
	 *
	 * @param entity         entité rendue
	 * @param entitypatch    patch RIG associé
	 * @param originalRender layer vanilla original (peut être {@code null} pour les customLayers)
	 * @param poseStack      pose stack courant (déjà en espace entité)
	 * @param buffer         buffer source
	 * @param packedLight    lumière packée
	 * @param poses          matrices de pose armature (index = jointId)
	 * @param bob            phase de bobbing vanilla
	 * @param yRotHeadDelta  delta entre yRot body et yRot head
	 * @param pitch          pitch (xRot) view
	 * @param partialTicks   partial ticks
	 */
	public void renderLayer(E entity, T entitypatch, L originalRender, PoseStack poseStack, MultiBufferSource buffer, int packedLight, OpenMatrix4f[] poses, float bob, float yRotHeadDelta, float pitch, float partialTicks) {
		// no-op — subclasses override
	}
}
