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

package com.hypixel.hytale.builtin.hytalegenerator.assets;

import com.hypixel.hytale.codec.validation.Validator;
import com.hypixel.hytale.codec.validation.Validators;
import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
import com.hypixel.hytale.codec.Codec;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import javax.annotation.Nonnull;
import java.util.List;
import com.hypixel.hytale.assetstore.AssetExtraInfo;
import com.hypixel.hytale.assetstore.codec.AssetBuilderCodec;
import com.hypixel.hytale.assetstore.map.DefaultAssetMap;
import com.hypixel.hytale.assetstore.map.JsonAssetWithMap;

public class SettingsAsset implements JsonAssetWithMap<String, DefaultAssetMap<String, SettingsAsset>>
{
    public static final AssetBuilderCodec<String, SettingsAsset> CODEC;
    private String id;
    private AssetExtraInfo.Data data;
    private Integer[] checkpoints;
    private int customConcurrency;
    private double bufferCapacityFactor;
    private double targetViewDistance;
    private double targetPlayerCount;
    
    private SettingsAsset() {
        this.checkpoints = new Integer[0];
        this.customConcurrency = -1;
        this.bufferCapacityFactor = 0.3;
        this.targetViewDistance = 512.0;
        this.targetPlayerCount = 3.0;
    }
    
    @Nonnull
    public List<Integer> getStatsCheckpoints() {
        return List.of(this.checkpoints);
    }
    
    public int getCustomConcurrency() {
        return this.customConcurrency;
    }
    
    public double getBufferCapacityFactor() {
        return this.bufferCapacityFactor;
    }
    
    public double getTargetViewDistance() {
        return this.targetViewDistance;
    }
    
    public double getTargetPlayerCount() {
        return this.targetPlayerCount;
    }
    
    public static int getSampleBits(final int v) {
        return switch (v) {
            case 2 -> 1;
            case 4 -> 2;
            case 8 -> 3;
            default -> 0;
        };
    }
    
    @Override
    public String getId() {
        return this.id;
    }
    
    static {
        CODEC = ((AssetBuilderCodec.Builder)AssetBuilderCodec.builder(SettingsAsset.class, SettingsAsset::new, (Codec<String>)Codec.STRING, (asset, id) -> asset.id = id, config -> config.id, (config, data) -> config.data = data, config -> config.data).append(new KeyedCodec<Integer[]>("StatsCheckpoints", new ArrayCodec<Integer>(Codec.INTEGER, Integer[]::new), true), (t, k) -> t.checkpoints = k, t -> t.checkpoints).add().append(new KeyedCodec("CustomConcurrency", Codec.INTEGER, true), (t, k) -> t.customConcurrency = k, t -> t.customConcurrency).addValidator(Validators.greaterThan(-2)).add().append(new KeyedCodec("BufferCapacityFactor", Codec.DOUBLE, true), (asset, value) -> asset.bufferCapacityFactor = value, asset -> asset.bufferCapacityFactor).addValidator(Validators.greaterThanOrEqual(0.0)).add().append(new KeyedCodec("TargetViewDistance", Codec.DOUBLE, true), (asset, value) -> asset.targetViewDistance = value, asset -> asset.targetViewDistance).addValidator(Validators.greaterThanOrEqual(0.0)).add().append(new KeyedCodec("TargetPlayerCount", Codec.DOUBLE, true), (asset, value) -> asset.targetPlayerCount = value, asset -> asset.targetPlayerCount).addValidator(Validators.greaterThanOrEqual(0.0)).add()).build();
    }
}
