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

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

import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
import com.hypixel.hytale.codec.Codec;
import java.util.HashSet;
import com.hypixel.hytale.codec.validation.ValidationResults;
import javax.annotation.Nonnull;
import com.hypixel.hytale.math.vector.Vector2d;
import com.hypixel.hytale.builtin.hytalegenerator.framework.math.NodeFunction;
import com.hypixel.hytale.assetstore.AssetExtraInfo;
import com.hypixel.hytale.assetstore.codec.AssetBuilderCodec;
import com.hypixel.hytale.builtin.hytalegenerator.assets.Cleanable;
import com.hypixel.hytale.assetstore.map.DefaultAssetMap;
import com.hypixel.hytale.assetstore.map.JsonAssetWithMap;

public class NodeFunctionYOutAsset implements JsonAssetWithMap<String, DefaultAssetMap<String, NodeFunctionYOutAsset>>, Cleanable
{
    public static final AssetBuilderCodec<String, NodeFunctionYOutAsset> CODEC;
    private String id;
    private AssetExtraInfo.Data data;
    private PointYOutAsset[] nodes;
    
    public NodeFunctionYOutAsset() {
        this.nodes = new PointYOutAsset[0];
    }
    
    @Nonnull
    public NodeFunction build() {
        final NodeFunction nodeFunction = new NodeFunction();
        for (final PointYOutAsset node : this.nodes) {
            final Vector2d point = node.build();
            nodeFunction.addPoint(point.x, point.y);
        }
        return nodeFunction;
    }
    
    @Override
    public String getId() {
        return this.id;
    }
    
    @Override
    public void cleanUp() {
    }
    
    static {
        CODEC = AssetBuilderCodec.builder(NodeFunctionYOutAsset.class, NodeFunctionYOutAsset::new, (Codec<String>)Codec.STRING, (asset, id) -> asset.id = id, config -> config.id, (config, data) -> config.data = data, config -> config.data).append(new KeyedCodec<PointYOutAsset[]>("Points", new ArrayCodec<PointYOutAsset>((Codec<PointYOutAsset>)PointYOutAsset.CODEC, PointYOutAsset[]::new), true), (t, k) -> t.nodes = k, t -> t.nodes).addValidator((v, r) -> {
            final HashSet ySet = new HashSet<Double>(v.length);
            final PointYOutAsset[] arr$ = v;
            final int len$ = arr$.length;
            int i$ = 0;
            while (i$ < len$) {
                final PointYOutAsset point = arr$[i$];
                if (ySet.contains(point.getY())) {
                    r.fail("More than one point with Y value: " + point.getY());
                }
                else {
                    ySet.add(point.getY());
                    ++i$;
                }
            }
        }).add().build();
    }
}
