package net.minecraft.world.level.levelgen.feature.foliageplacers;

import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.BlockPos;
import net.minecraft.util.RandomSource;
import net.minecraft.util.valueproviders.IntProvider;
import net.minecraft.world.level.LevelSimulatedReader;
import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration;

public class DarkOakFoliagePlacer extends FoliagePlacer {
   public static final Codec<DarkOakFoliagePlacer> CODEC = RecordCodecBuilder.create((p_68473_) -> {
      return foliagePlacerParts(p_68473_).apply(p_68473_, DarkOakFoliagePlacer::new);
   });

   public DarkOakFoliagePlacer(IntProvider p_161384_, IntProvider p_161385_) {
      super(p_161384_, p_161385_);
   }

   protected FoliagePlacerType<?> type() {
      return FoliagePlacerType.DARK_OAK_FOLIAGE_PLACER;
   }

   protected void createFoliage(LevelSimulatedReader p_225558_, FoliagePlacer.FoliageSetter p_273641_, RandomSource p_225560_, TreeConfiguration p_225561_, int p_225562_, FoliagePlacer.FoliageAttachment p_225563_, int p_225564_, int p_225565_, int p_225566_) {
      BlockPos blockpos = p_225563_.pos().above(p_225566_);
      boolean flag = p_225563_.doubleTrunk();
      if (flag) {
         this.placeLeavesRow(p_225558_, p_273641_, p_225560_, p_225561_, blockpos, p_225565_ + 2, -1, flag);
         this.placeLeavesRow(p_225558_, p_273641_, p_225560_, p_225561_, blockpos, p_225565_ + 3, 0, flag);
         this.placeLeavesRow(p_225558_, p_273641_, p_225560_, p_225561_, blockpos, p_225565_ + 2, 1, flag);
         if (p_225560_.nextBoolean()) {
            this.placeLeavesRow(p_225558_, p_273641_, p_225560_, p_225561_, blockpos, p_225565_, 2, flag);
         }
      } else {
         this.placeLeavesRow(p_225558_, p_273641_, p_225560_, p_225561_, blockpos, p_225565_ + 2, -1, flag);
         this.placeLeavesRow(p_225558_, p_273641_, p_225560_, p_225561_, blockpos, p_225565_ + 1, 0, flag);
      }

   }

   public int foliageHeight(RandomSource p_225554_, int p_225555_, TreeConfiguration p_225556_) {
      return 4;
   }

   protected boolean shouldSkipLocationSigned(RandomSource p_225568_, int p_225569_, int p_225570_, int p_225571_, int p_225572_, boolean p_225573_) {
      return p_225570_ != 0 || !p_225573_ || p_225569_ != -p_225572_ && p_225569_ < p_225572_ || p_225571_ != -p_225572_ && p_225571_ < p_225572_ ? super.shouldSkipLocationSigned(p_225568_, p_225569_, p_225570_, p_225571_, p_225572_, p_225573_) : true;
   }

   protected boolean shouldSkipLocation(RandomSource p_225547_, int p_225548_, int p_225549_, int p_225550_, int p_225551_, boolean p_225552_) {
      if (p_225549_ == -1 && !p_225552_) {
         return p_225548_ == p_225551_ && p_225550_ == p_225551_;
      } else if (p_225549_ == 1) {
         return p_225548_ + p_225550_ > p_225551_ * 2 - 2;
      } else {
         return false;
      }
   }
}