package net.vulkanmod.render.model.quad;

import net.minecraft.class_2350;

public class ModelQuadFlags {
   public static final int IS_PARTIAL = 1;
   public static final int IS_PARALLEL = 2;
   public static final int IS_ALIGNED = 4;

   public static boolean contains(int flags, int mask) {
      return (flags & mask) != 0;
   }

   public static int getQuadFlags(ModelQuadView quad, class_2350 face) {
      float minX = 32.0F;
      float minY = 32.0F;
      float minZ = 32.0F;
      float maxX = -32.0F;
      float maxY = -32.0F;
      float maxZ = -32.0F;

      for(int i = 0; i < 4; ++i) {
         float x = quad.getX(i);
         float y = quad.getY(i);
         float z = quad.getZ(i);
         minX = Math.min(minX, x);
         minY = Math.min(minY, y);
         minZ = Math.min(minZ, z);
         maxX = Math.max(maxX, x);
         maxY = Math.max(maxY, y);
         maxZ = Math.max(maxZ, z);
      }

      boolean var10000;
      switch (face.method_10166()) {
         case field_11048 -> var10000 = minY >= 1.0E-4F || minZ >= 1.0E-4F || maxY <= 0.9999F || maxZ <= 0.9999F;
         case field_11052 -> var10000 = minX >= 1.0E-4F || minZ >= 1.0E-4F || maxX <= 0.9999F || maxZ <= 0.9999F;
         case field_11051 -> var10000 = minX >= 1.0E-4F || minY >= 1.0E-4F || maxX <= 0.9999F || maxY <= 0.9999F;
         default -> throw new MatchException((String)null, (Throwable)null);
      }

      boolean partial = var10000;
      switch (face.method_10166()) {
         case field_11048 -> var10000 = minX == maxX;
         case field_11052 -> var10000 = minY == maxY;
         case field_11051 -> var10000 = minZ == maxZ;
         default -> throw new MatchException((String)null, (Throwable)null);
      }

      boolean parallel;
      label86: {
         label85: {
            parallel = var10000;
            if (parallel) {
               switch (face) {
                  case field_11033:
                     if (minY < 1.0E-4F) {
                        break label85;
                     }
                     break;
                  case field_11036:
                     if (maxY > 0.9999F) {
                        break label85;
                     }
                     break;
                  case field_11043:
                     if (minZ < 1.0E-4F) {
                        break label85;
                     }
                     break;
                  case field_11035:
                     if (maxZ > 0.9999F) {
                        break label85;
                     }
                     break;
                  case field_11039:
                     if (minX < 1.0E-4F) {
                        break label85;
                     }
                     break;
                  case field_11034:
                     if (maxX > 0.9999F) {
                        break label85;
                     }
                     break;
                  default:
                     throw new MatchException((String)null, (Throwable)null);
               }
            }

            var10000 = false;
            break label86;
         }

         var10000 = true;
      }

      boolean aligned = var10000;
      int flags = 0;
      if (partial) {
         flags |= 1;
      }

      if (parallel) {
         flags |= 2;
      }

      if (aligned) {
         flags |= 4;
      }

      return flags;
   }
}
