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

package com.hypixel.hytale.server.core.entity.entities.player;

import com.hypixel.hytale.protocol.Packet;
import com.hypixel.hytale.protocol.ServerCameraSettings;
import com.hypixel.hytale.protocol.packets.camera.SetServerCamera;
import com.hypixel.hytale.protocol.ClientCameraView;
import com.hypixel.hytale.server.core.universe.PlayerRef;
import javax.annotation.Nonnull;
import java.util.EnumMap;
import com.hypixel.hytale.server.core.modules.entity.EntityModule;
import com.hypixel.hytale.component.ComponentType;
import com.hypixel.hytale.math.vector.Vector2d;
import com.hypixel.hytale.math.vector.Vector3i;
import com.hypixel.hytale.protocol.MouseButtonState;
import com.hypixel.hytale.protocol.MouseButtonType;
import java.util.Map;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Component;

public class CameraManager implements Component<EntityStore>
{
    private final Map<MouseButtonType, MouseButtonState> mouseStates;
    private final Map<MouseButtonType, Vector3i> mousePressedPosition;
    private final Map<MouseButtonType, Vector3i> mouseReleasedPosition;
    private Vector2d lastScreenPoint;
    private Vector3i lastTargetBlock;
    
    public static ComponentType<EntityStore, CameraManager> getComponentType() {
        return EntityModule.get().getCameraManagerComponentType();
    }
    
    public CameraManager() {
        this.mouseStates = new EnumMap<MouseButtonType, MouseButtonState>(MouseButtonType.class);
        this.mousePressedPosition = new EnumMap<MouseButtonType, Vector3i>(MouseButtonType.class);
        this.mouseReleasedPosition = new EnumMap<MouseButtonType, Vector3i>(MouseButtonType.class);
        this.lastScreenPoint = Vector2d.ZERO;
    }
    
    public CameraManager(@Nonnull final CameraManager other) {
        this();
        this.lastScreenPoint = other.lastScreenPoint;
        this.lastTargetBlock = other.lastTargetBlock;
    }
    
    public void resetCamera(@Nonnull final PlayerRef ref) {
        ref.getPacketHandler().writeNoCache(new SetServerCamera(ClientCameraView.Custom, false, null));
        this.mouseStates.clear();
    }
    
    public void handleMouseButtonState(final MouseButtonType mouseButtonType, final MouseButtonState state, final Vector3i targetBlock) {
        this.mouseStates.put(mouseButtonType, state);
        if (state == MouseButtonState.Pressed) {
            this.mousePressedPosition.put(mouseButtonType, targetBlock);
        }
        if (state == MouseButtonState.Released) {
            this.mouseReleasedPosition.put(mouseButtonType, targetBlock);
        }
    }
    
    public MouseButtonState getMouseButtonState(final MouseButtonType mouseButtonType) {
        return this.mouseStates.getOrDefault(mouseButtonType, MouseButtonState.Released);
    }
    
    public Vector3i getLastMouseButtonPressedPosition(final MouseButtonType mouseButtonType) {
        return this.mousePressedPosition.get(mouseButtonType);
    }
    
    public Vector3i getLastMouseButtonReleasedPosition(final MouseButtonType mouseButtonType) {
        return this.mouseReleasedPosition.get(mouseButtonType);
    }
    
    public void setLastScreenPoint(final Vector2d lastScreenPoint) {
        this.lastScreenPoint = lastScreenPoint;
    }
    
    public Vector2d getLastScreenPoint() {
        return this.lastScreenPoint;
    }
    
    public void setLastBlockPosition(final Vector3i targetBlock) {
        this.lastTargetBlock = targetBlock;
    }
    
    public Vector3i getLastTargetBlock() {
        return this.lastTargetBlock;
    }
    
    @Nonnull
    @Override
    public Component<EntityStore> clone() {
        return new CameraManager(this);
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "CameraManager{mouseStates=" + String.valueOf(this.mouseStates) + ", mousePressedPosition=" + String.valueOf(this.mousePressedPosition) + ", mouseReleasedPosition=" + String.valueOf(this.mouseReleasedPosition) + ", lastScreenPoint=" + String.valueOf(this.lastScreenPoint) + ", lastTargetBlock=" + String.valueOf(this.lastTargetBlock);
    }
}
