package com.teamwizardry.wizardry.api.structure;

import com.teamwizardry.librarianlib.features.structure.Structure;
import com.teamwizardry.librarianlib.features.structure.TemplateBlockAccess;
import net.minecraft.block.state.IBlockState;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.EnumSkyBlock;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.WorldType;
import net.minecraft.world.biome.Biome;
import org.jetbrains.annotations.NotNull;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

/**
 * The whole purpose of this class is to make getTemplateBlocks public
 */
public class WizardryStructure extends Structure {

	private final WizardryStructureBlockAccess wizardryAccess;

	public WizardryStructure(@Nonnull ResourceLocation loc) {
		super(loc);

		wizardryAccess = new WizardryStructureBlockAccess(blockAccess);
	}

	public WizardryStructureBlockAccess getWizardryAccess() {
		return wizardryAccess;
	}

	public static class WizardryStructureBlockAccess implements IBlockAccess {

		private final TemplateBlockAccess originalAccess;

		WizardryStructureBlockAccess(TemplateBlockAccess originalAccess) {
			this.originalAccess = originalAccess;
		}

		@Nullable
		@Override
		public TileEntity getTileEntity(@NotNull BlockPos pos) {
			return originalAccess.getTileEntity(pos);
		}

		@Override
		public int getCombinedLight(@NotNull BlockPos pos, int lightValue) {
			int sky = EnumSkyBlock.SKY.defaultLightValue;
			int block = Math.max(EnumSkyBlock.BLOCK.defaultLightValue, lightValue);
			return sky << 20 | block << 4;
		}

		@NotNull
		@Override
		public IBlockState getBlockState(@NotNull BlockPos pos) {
			return originalAccess.getBlockState(pos);
		}

		@Override
		public boolean isAirBlock(@NotNull BlockPos pos) {
			return originalAccess.isAirBlock(pos);
		}

		@NotNull
		@Override
		public Biome getBiome(@NotNull BlockPos pos) {
			return originalAccess.getBiome(pos);
		}

		@Override
		public int getStrongPower(@NotNull BlockPos pos, @NotNull EnumFacing direction) {
			return originalAccess.getStrongPower(pos, direction);
		}

		@NotNull
		@Override
		public WorldType getWorldType() {
			return originalAccess.getWorldType();
		}

		@Override
		public boolean isSideSolid(@NotNull BlockPos pos, @NotNull EnumFacing side, boolean _default) {
			return originalAccess.isSideSolid(pos, side, _default);
		}
	}
}