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

package com.hypixel.hytale.server.core.io.handlers.login;

import com.hypixel.hytale.server.core.auth.PlayerAuthentication;
import java.util.logging.Level;
import com.hypixel.hytale.server.core.universe.Universe;
import com.hypixel.hytale.server.core.HytaleServer;
import com.hypixel.hytale.server.core.io.PacketHandler;
import com.hypixel.hytale.server.core.io.netty.NettyUtil;
import com.hypixel.hytale.protocol.HostAddress;
import javax.annotation.Nullable;
import java.util.UUID;
import com.hypixel.hytale.protocol.packets.connection.ClientType;
import com.hypixel.hytale.server.core.io.ProtocolVersion;
import javax.annotation.Nonnull;
import io.netty.channel.Channel;

public class AuthenticationPacketHandler extends HandshakeHandler
{
    private final AuthHandlerSupplier authHandlerSupplier;
    
    public AuthenticationPacketHandler(@Nonnull final Channel channel, @Nonnull final ProtocolVersion protocolVersion, @Nonnull final String language, @Nonnull final AuthHandlerSupplier authHandlerSupplier, @Nonnull final ClientType clientType, @Nonnull final String identityToken, @Nonnull final UUID uuid, @Nonnull final String username, @Nullable final byte[] referralData, @Nullable final HostAddress referralSource) {
        super(channel, protocolVersion, language, clientType, identityToken, uuid, username, referralData, referralSource);
        this.authHandlerSupplier = authHandlerSupplier;
    }
    
    @Nonnull
    @Override
    public String getIdentifier() {
        return "{Authenticating(" + NettyUtil.formatRemoteAddress(this.channel) + "), authHandlerSupplier=" + String.valueOf(this.authHandlerSupplier);
    }
    
    @Override
    public void registered0(final PacketHandler oldHandler) {
        final int maxPlayers = HytaleServer.get().getConfig().getMaxPlayers();
        if (maxPlayers > 0 && Universe.get().getPlayerCount() >= maxPlayers) {
            this.disconnect("Too many players!");
            return;
        }
        super.registered0(oldHandler);
    }
    
    @Override
    protected void onAuthenticated(final byte[] passwordChallenge) {
        PacketHandler.logConnectionTimings(this.channel, "Authenticated", Level.FINE);
        NettyUtil.setChannelHandler(this.channel, new PasswordPacketHandler(this.channel, this.protocolVersion, this.language, this.auth.getUuid(), this.auth.getUsername(), this.auth.getReferralData(), this.auth.getReferralSource(), passwordChallenge, (ch, pv, lang, a) -> this.authHandlerSupplier.create(ch, pv, lang, a)));
    }
    
    @FunctionalInterface
    public interface AuthHandlerSupplier
    {
        PacketHandler create(final Channel p0, final ProtocolVersion p1, final String p2, final PlayerAuthentication p3);
    }
}
