package net.fabricmc.fabric.mixin.renderer.client.sprite;

import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.renderer.v1.model.SpriteFinder;
import net.fabricmc.fabric.impl.renderer.MissingSpriteFinderImpl;
import net.minecraft.class_1058;
import net.minecraft.class_10725;
import net.minecraft.class_2960;
import net.minecraft.class_7766;
import net.minecraft.class_9826;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;

@Environment(EnvType.CLIENT)
@Mixin(
   targets = {"net/minecraft/class_1092$1"}
)
abstract class BakedModelManager1Mixin implements class_9826 {
   @Shadow
   @Final
   private class_1058 field_55480;
   @Shadow
   @Final
   class_7766.class_7767 field_61871;
   @Unique
   private volatile @Nullable MissingSpriteFinderImpl missingSpriteFinder;

   public SpriteFinder spriteFinder(class_2960 atlasId) {
      if (atlasId.equals(class_10725.field_56382)) {
         return this.field_61871.spriteFinder();
      } else {
         MissingSpriteFinderImpl result = this.missingSpriteFinder;
         if (result == null) {
            synchronized(this) {
               result = this.missingSpriteFinder;
               if (result == null) {
                  this.missingSpriteFinder = result = new MissingSpriteFinderImpl(this.field_55480);
               }
            }
         }

         return result;
      }
   }
}
