package net.fabricmc.fabric.mixin.resource.loader;

import com.mojang.datafixers.DataFixer;
import java.net.Proxy;
import java.util.List;
import net.fabricmc.fabric.impl.resource.loader.BuiltinModResourcePackSource;
import net.fabricmc.fabric.impl.resource.loader.FabricOriginalKnownPacksGetter;
import net.fabricmc.fabric.impl.resource.loader.ModNioResourcePack;
import net.minecraft.class_11545;
import net.minecraft.class_32;
import net.minecraft.class_3262;
import net.minecraft.class_3283;
import net.minecraft.class_3288;
import net.minecraft.class_6904;
import net.minecraft.class_7497;
import net.minecraft.class_9226;
import net.minecraft.server.MinecraftServer;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin({MinecraftServer.class})
public class MinecraftServerMixin implements FabricOriginalKnownPacksGetter {
   @Unique
   private List<class_9226> fabric_originalKnownPacks;

   @Inject(
      method = {"<init>(Ljava/lang/Thread;Lnet/minecraft/class_32$class_5143;Lnet/minecraft/class_3283;Lnet/minecraft/class_6904;Ljava/net/Proxy;Lcom/mojang/datafixers/DataFixer;Lnet/minecraft/class_7497;Lnet/minecraft/class_11545;)V"},
      at = {@At("TAIL")}
   )
   private void init(Thread serverThread, class_32.class_5143 session, class_3283 dataPackManager, class_6904 saveLoader, Proxy proxy, DataFixer dataFixer, class_7497 apiServices, class_11545 chunkLoadProgress, CallbackInfo ci) {
      this.fabric_originalKnownPacks = saveLoader.comp_356().method_29213().flatMap((pack) -> pack.method_56926().comp_2332().stream()).toList();
   }

   @Redirect(
      method = {"method_29736(Lnet/minecraft/class_3283;Lnet/minecraft/class_7712;ZZ)Lnet/minecraft/class_7712;"},
      at = @At(
   value = "INVOKE",
   target = "Ljava/util/List;contains(Ljava/lang/Object;)Z"
)
   )
   private static boolean onCheckDisabled(List<String> list, Object o, class_3283 resourcePackManager) {
      String profileId = (String)o;
      boolean contains = list.contains(profileId);
      if (contains) {
         return true;
      } else {
         class_3288 profile = resourcePackManager.method_14449(profileId);
         if (profile.method_29483() instanceof BuiltinModResourcePackSource) {
            class_3262 pack = profile.method_14458();

            boolean var11;
            try {
               boolean var10000;
               label36: {
                  if (pack instanceof ModNioResourcePack) {
                     ModNioResourcePack modPack = (ModNioResourcePack)pack;
                     if (!modPack.getActivationType().isEnabledByDefault()) {
                        var10000 = true;
                        break label36;
                     }
                  }

                  var10000 = false;
               }

               var11 = var10000;
            } catch (Throwable var10) {
               if (pack != null) {
                  try {
                     pack.close();
                  } catch (Throwable var9) {
                     var10.addSuppressed(var9);
                  }
               }

               throw var10;
            }

            if (pack != null) {
               pack.close();
            }

            return var11;
         } else {
            return false;
         }
      }
   }

   public List<class_9226> fabric_getOriginalKnownPacks() {
      return this.fabric_originalKnownPacks;
   }
}
