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

package com.hypixel.hytale.codec.codecs;

import com.hypixel.hytale.codec.schema.config.StringSchema;
import com.hypixel.hytale.codec.schema.config.Schema;
import com.hypixel.hytale.codec.schema.SchemaContext;
import java.io.IOException;
import com.hypixel.hytale.codec.util.RawJsonReader;
import com.hypixel.hytale.codec.ExtraInfo;
import javax.annotation.Nonnull;
import org.bson.BsonValue;
import java.util.regex.Pattern;
import java.net.InetSocketAddress;
import com.hypixel.hytale.codec.Codec;

public class InetSocketAddressCodec implements Codec<InetSocketAddress>
{
    private static final Pattern ADDRESS_PATTERN;
    private final int defaultPort;
    
    public InetSocketAddressCodec(final int defaultPort) {
        this.defaultPort = defaultPort;
    }
    
    @Nonnull
    @Override
    public InetSocketAddress decode(@Nonnull final BsonValue bsonValue, final ExtraInfo extraInfo) {
        final String decode = InetSocketAddressCodec.STRING.decode(bsonValue, extraInfo);
        return decodeString(decode, this.defaultPort);
    }
    
    @Nonnull
    @Override
    public BsonValue encode(@Nonnull final InetSocketAddress r, final ExtraInfo extraInfo) {
        return InetSocketAddressCodec.STRING.encode(r.getHostString() + ":" + r.getPort(), extraInfo);
    }
    
    @Nonnull
    @Override
    public InetSocketAddress decodeJson(@Nonnull final RawJsonReader reader, final ExtraInfo extraInfo) throws IOException {
        final String decode = InetSocketAddressCodec.STRING.decodeJson(reader, extraInfo);
        return decodeString(decode, this.defaultPort);
    }
    
    @Nonnull
    @Override
    public Schema toSchema(@Nonnull final SchemaContext context) {
        final StringSchema s = new StringSchema();
        s.setPattern(InetSocketAddressCodec.ADDRESS_PATTERN);
        return s;
    }
    
    @Nonnull
    private static InetSocketAddress decodeString(@Nonnull final String value, final int defaultPort) {
        if (value.contains(":")) {
            final String[] split = value.split(":", 2);
            return new InetSocketAddress(split[0], Integer.parseInt(split[1]));
        }
        try {
            return new InetSocketAddress(Integer.parseInt(value));
        }
        catch (final NumberFormatException e) {
            return new InetSocketAddress(value, defaultPort);
        }
    }
    
    static {
        ADDRESS_PATTERN = Pattern.compile("(.*?:)?[0-9]+");
    }
}
