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

import java.util.Set;
import java.util.function.Predicate;
import net.fabricmc.fabric.impl.resource.loader.FabricResourcePackProfile;
import net.fabricmc.fabric.impl.resource.loader.ResourcePackSourceTracker;
import net.minecraft.class_3262;
import net.minecraft.class_3288;
import net.minecraft.class_9224;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
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.callback.CallbackInfoReturnable;

@Mixin({class_3288.class})
abstract class ResourcePackProfileMixin implements FabricResourcePackProfile {
   @Unique
   private static final Predicate<Set<String>> DEFAULT_PARENT_PREDICATE = (parents) -> true;
   @Unique
   private Predicate<Set<String>> parentsPredicate;

   ResourcePackProfileMixin() {
      this.parentsPredicate = DEFAULT_PARENT_PREDICATE;
   }

   @Shadow
   public abstract class_9224 method_56933();

   @Inject(
      method = {"method_14458()Lnet/minecraft/class_3262;"},
      at = {@At("RETURN")}
   )
   private void onCreateResourcePack(CallbackInfoReturnable<class_3262> info) {
      ResourcePackSourceTracker.setSource((class_3262)info.getReturnValue(), this.method_56933().comp_2331());
   }

   public boolean fabric_isHidden() {
      return this.parentsPredicate != DEFAULT_PARENT_PREDICATE;
   }

   public boolean fabric_parentsEnabled(Set<String> enabled) {
      return this.parentsPredicate.test(enabled);
   }

   public void fabric_setParentsPredicate(Predicate<Set<String>> predicate) {
      this.parentsPredicate = predicate;
   }
}
