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

import com.llamalad7.mixinextras.sugar.Local;
import java.util.ArrayList;
import java.util.List;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.impl.resource.loader.FabricResourcePackProfile;
import net.minecraft.class_310;
import net.minecraft.class_3283;
import net.minecraft.class_3288;
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.ModifyArg;

@Environment(EnvType.CLIENT)
@Mixin(
   targets = {"net/minecraft/class_315$3"}
)
public class GameOptionsWriteVisitorMixin {
   @Unique
   private static List<String> toPackListString(List<String> packs) {
      List<String> copy = new ArrayList(packs.size());
      class_3283 manager = class_310.method_1551().method_1520();

      for(String pack : packs) {
         class_3288 profile = manager.method_14449(pack);
         if (profile == null || !((FabricResourcePackProfile)profile).fabric_isHidden()) {
            copy.add(pack);
         }
      }

      return copy;
   }

   @ModifyArg(
      method = {"method_33681(Ljava/lang/String;Ljava/lang/Object;Ljava/util/function/Function;Ljava/util/function/Function;)Ljava/lang/Object;"},
      at = @At(
   value = "INVOKE",
   target = "Ljava/util/function/Function;apply(Ljava/lang/Object;)Ljava/lang/Object;"
)
   )
   private <T> T skipHiddenPacks(T value, @Local String key) {
      return (T)("resourcePacks".equals(key) && value instanceof List ? toPackListString((List)value) : value);
   }
}
