package net.fabricmc.fabric.api.renderer.v1.mesh;

import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.util.TriState;
import net.minecraft.class_10444;
import net.minecraft.class_1058;
import net.minecraft.class_11515;
import net.minecraft.class_2350;
import net.minecraft.class_290;
import net.minecraft.class_765;
import net.minecraft.class_777;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.joml.Vector2f;
import org.joml.Vector3f;
import org.joml.Vector3fc;

@Environment(EnvType.CLIENT)
public interface QuadView {
   int VANILLA_VERTEX_STRIDE = class_290.field_1590.getVertexSize() / 4;
   int VANILLA_QUAD_STRIDE = VANILLA_VERTEX_STRIDE * 4;

   float x(int var1);

   float y(int var1);

   float z(int var1);

   float posByIndex(int var1, int var2);

   Vector3f copyPos(int var1, @Nullable Vector3f var2);

   int color(int var1);

   float u(int var1);

   float v(int var1);

   Vector2f copyUv(int var1, @Nullable Vector2f var2);

   int lightmap(int var1);

   boolean hasNormal(int var1);

   float normalX(int var1);

   float normalY(int var1);

   float normalZ(int var1);

   @Nullable Vector3f copyNormal(int var1, @Nullable Vector3f var2);

   Vector3fc faceNormal();

   @NotNull class_2350 lightFace();

   @Nullable class_2350 nominalFace();

   @Nullable class_2350 cullFace();

   @Nullable class_11515 renderLayer();

   boolean emissive();

   boolean diffuseShade();

   TriState ambientOcclusion();

   class_10444.@Nullable class_10445 glint();

   ShadeMode shadeMode();

   int tintIndex();

   int tag();

   void toVanilla(int[] var1, int var2);

   default class_777 toBakedQuad(class_1058 sprite) {
      int[] vertexData = new int[VANILLA_QUAD_STRIDE];
      this.toVanilla(vertexData, 0);
      int lightEmission = 15;
      if (!this.emissive()) {
         for(int i = 0; i < 4; ++i) {
            int lightmap = this.lightmap(i);
            if (lightmap == 0) {
               lightEmission = 0;
               break;
            }

            int blockLight = class_765.method_24186(lightmap);
            int skyLight = class_765.method_24187(lightmap);
            lightEmission = Math.min(lightEmission, Math.min(blockLight, skyLight));
         }
      }

      return new class_777(vertexData, this.tintIndex(), this.lightFace(), sprite, this.diffuseShade(), lightEmission);
   }
}
