// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.builtin.crafting.interaction;

import com.hypixel.hytale.codec.validation.Validator;
import com.hypixel.hytale.codec.validation.Validators;
import com.hypixel.hytale.codec.Codec;
import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.codec.codecs.EnumCodec;
import java.util.UUID;
import com.hypixel.hytale.builtin.crafting.window.BenchWindow;
import com.hypixel.hytale.server.core.entity.entities.player.windows.MaterialContainerWindow;
import com.hypixel.hytale.server.core.universe.world.meta.BlockState;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.core.entity.entities.player.windows.Window;
import com.hypixel.hytale.protocol.packets.interface_.Page;
import com.hypixel.hytale.server.core.entity.UUIDComponent;
import com.hypixel.hytale.builtin.crafting.window.StructuralCraftingWindow;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.builtin.crafting.window.DiagramCraftingWindow;
import com.hypixel.hytale.builtin.crafting.window.SimpleCraftingWindow;
import com.hypixel.hytale.builtin.crafting.state.BenchState;
import com.hypixel.hytale.builtin.crafting.component.CraftingManager;
import com.hypixel.hytale.server.core.entity.entities.Player;
import com.hypixel.hytale.server.core.modules.interaction.interaction.CooldownHandler;
import com.hypixel.hytale.math.vector.Vector3i;
import javax.annotation.Nullable;
import com.hypixel.hytale.server.core.inventory.ItemStack;
import com.hypixel.hytale.server.core.entity.InteractionContext;
import com.hypixel.hytale.protocol.InteractionType;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.CommandBuffer;
import com.hypixel.hytale.server.core.universe.world.World;
import javax.annotation.Nonnull;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.server.core.modules.interaction.interaction.config.RootInteraction;
import com.hypixel.hytale.server.core.modules.interaction.interaction.config.client.SimpleBlockInteraction;

public class OpenBenchPageInteraction extends SimpleBlockInteraction
{
    public static final OpenBenchPageInteraction SIMPLE_CRAFTING;
    public static final RootInteraction SIMPLE_CRAFTING_ROOT;
    public static final OpenBenchPageInteraction DIAGRAM_CRAFTING;
    public static final RootInteraction DIAGRAM_CRAFTING_ROOT;
    public static final OpenBenchPageInteraction STRUCTURAL_CRAFTING;
    public static final RootInteraction STRUCTURAL_CRAFTING_ROOT;
    @Nonnull
    public static final BuilderCodec<OpenBenchPageInteraction> CODEC;
    @Nonnull
    private PageType pageType;
    
    public OpenBenchPageInteraction(@Nonnull final String id, @Nonnull final PageType pageType) {
        super(id);
        this.pageType = PageType.SIMPLE_CRAFTING;
        this.pageType = pageType;
    }
    
    protected OpenBenchPageInteraction() {
        this.pageType = PageType.SIMPLE_CRAFTING;
    }
    
    @Override
    protected void interactWithBlock(@Nonnull final World world, @Nonnull final CommandBuffer<EntityStore> commandBuffer, @Nonnull final InteractionType type, @Nonnull final InteractionContext context, @Nullable final ItemStack itemInHand, @Nonnull final Vector3i targetBlock, @Nonnull final CooldownHandler cooldownHandler) {
        final Ref<EntityStore> ref = context.getEntity();
        final Store<EntityStore> store = ref.getStore();
        final Player playerComponent = commandBuffer.getComponent(ref, Player.getComponentType());
        if (playerComponent == null) {
            return;
        }
        final CraftingManager craftingManagerComponent = commandBuffer.getComponent(ref, CraftingManager.getComponentType());
        assert craftingManagerComponent != null;
        if (craftingManagerComponent.hasBenchSet()) {
            return;
        }
        final BlockState state = world.getState(targetBlock.x, targetBlock.y, targetBlock.z, true);
        if (state instanceof final BenchState benchState) {
            final BenchWindow benchWindow = switch (this.pageType.ordinal()) {
                default -> throw new MatchException(null, null);
                case 0 -> new SimpleCraftingWindow(benchState);
                case 1 -> new DiagramCraftingWindow(ref, commandBuffer, benchState);
                case 2 -> new StructuralCraftingWindow(benchState);
            };
            final UUIDComponent uuidComponent = commandBuffer.getComponent(ref, UUIDComponent.getComponentType());
            assert uuidComponent != null;
            final UUID uuid = uuidComponent.getUuid();
            if (benchState.getWindows().putIfAbsent(uuid, benchWindow) == null) {
                benchWindow.registerCloseEvent(event -> benchState.getWindows().remove(uuid, benchWindow));
            }
            playerComponent.getPageManager().setPageWithWindows(ref, store, Page.Bench, true, benchWindow);
        }
    }
    
    @Override
    protected void simulateInteractWithBlock(@Nonnull final InteractionType type, @Nonnull final InteractionContext context, @Nullable final ItemStack itemInHand, @Nonnull final World world, @Nonnull final Vector3i targetBlock) {
    }
    
    static {
        SIMPLE_CRAFTING = new OpenBenchPageInteraction("*Simple_Crafting_Default", PageType.SIMPLE_CRAFTING);
        SIMPLE_CRAFTING_ROOT = new RootInteraction(OpenBenchPageInteraction.SIMPLE_CRAFTING.getId(), new String[] { OpenBenchPageInteraction.SIMPLE_CRAFTING.getId() });
        DIAGRAM_CRAFTING = new OpenBenchPageInteraction("*Diagram_Crafting_Default", PageType.DIAGRAM_CRAFTING);
        DIAGRAM_CRAFTING_ROOT = new RootInteraction(OpenBenchPageInteraction.DIAGRAM_CRAFTING.getId(), new String[] { OpenBenchPageInteraction.DIAGRAM_CRAFTING.getId() });
        STRUCTURAL_CRAFTING = new OpenBenchPageInteraction("*Structural_Crafting_Default", PageType.STRUCTURAL_CRAFTING);
        STRUCTURAL_CRAFTING_ROOT = new RootInteraction(OpenBenchPageInteraction.STRUCTURAL_CRAFTING.getId(), new String[] { OpenBenchPageInteraction.STRUCTURAL_CRAFTING.getId() });
        CODEC = BuilderCodec.builder(OpenBenchPageInteraction.class, OpenBenchPageInteraction::new, SimpleBlockInteraction.CODEC).documentation("Opens the given crafting bench page.").appendInherited(new KeyedCodec("Page", new EnumCodec(PageType.class)), (o, v) -> o.pageType = v, o -> o.pageType, (o, p) -> o.pageType = p.pageType).addValidator(Validators.nonNull()).add().build();
    }
    
    private enum PageType
    {
        SIMPLE_CRAFTING, 
        DIAGRAM_CRAFTING, 
        STRUCTURAL_CRAFTING;
    }
}
