package net.vulkanmod.mixin.profiling;

import com.google.common.base.Stopwatch;
import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap;
import java.util.Map;
import java.util.OptionalLong;
import java.util.concurrent.TimeUnit;
import net.minecraft.class_7965;
import net.minecraft.class_7966;
import net.minecraft.class_7969;
import net.minecraft.class_8561;
import org.slf4j.Logger;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;

@Mixin({class_8561.class})
public class GameLoadTimeEventM {
   @Shadow
   @Final
   private Map<class_7969<class_8561.class_8562>, Stopwatch> field_44845;
   @Shadow
   @Final
   private static Logger field_44843;
   @Shadow
   private OptionalLong field_44846;

   public void send(class_7965 telemetryEventSender) {
      Map<class_7969, class_8561.class_8562> measurements = new Reference2ReferenceOpenHashMap();
      synchronized(this) {
         this.field_44845.forEach((telemetryProperty, stopwatch) -> {
            if (!stopwatch.isRunning()) {
               long l = stopwatch.elapsed(TimeUnit.MILLISECONDS);
               measurements.put(telemetryProperty, new class_8561.class_8562((int)l));
            } else {
               field_44843.warn("Measurement {} was discarded since it was still ongoing when the event {} was sent.", telemetryProperty.comp_1171(), class_7966.field_44833.method_47720());
            }

         });
         this.field_44846.ifPresent((l) -> measurements.put(class_7969.field_44835, new class_8561.class_8562((int)l)));
         this.field_44845.clear();
      }

      StringBuilder stringBuilder = new StringBuilder("\n");

      for(class_7969 property : measurements.keySet()) {
         class_8561.class_8562 measurement = (class_8561.class_8562)measurements.get(property);
         stringBuilder.append("%s: %sms\n".formatted(property.comp_1171(), measurement.comp_1531()));
      }

      field_44843.info(stringBuilder.toString());
   }
}
