package com.jummit.nethermap.config;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.jummit.nethermap.Height;
import com.jummit.nethermap.CreationHeight;
import com.jummit.nethermap.FixedHeight;
import com.jummit.nethermap.HeightmapHeight;

import me.shedaniel.autoconfig.AutoConfig;
import me.shedaniel.autoconfig.ConfigData;
import me.shedaniel.autoconfig.annotation.Config;
import me.shedaniel.autoconfig.annotation.ConfigEntry;
import net.minecraft.entity.Entity;
import net.minecraft.item.map.MapState;
import net.minecraft.world.World;
import net.minecraft.world.chunk.WorldChunk;

@Config(name = "nethermap")
public class NetherMapConfig implements ConfigData {

    @ConfigEntry.Gui.Tooltip()
    public boolean useMapCreationHeight = true;
    @ConfigEntry.Gui.Tooltip()
    public int fixedHeight = 100;
    @ConfigEntry.Gui.Tooltip()
    public List<FixedEntry> fixedEntries = Arrays.asList(new FixedEntry("minecraft:the_nether", 40));
    @ConfigEntry.Gui.Tooltip()
    public List<String> creationHeightEntries = new ArrayList<String>();

    public static NetherMapConfig getInstance() {
        return AutoConfig.getConfigHolder(NetherMapConfig.class).getConfig();
    }

    public Height getHeightFor(WorldChunk chunk, int x, int z, World world, Entity entity, MapState state) {
        String dimension = world.getRegistryKey().getValue().toString();
        Height heightmapHeight = new HeightmapHeight(chunk, x, z);
        Height creationHeight = new CreationHeight(world, entity, state, heightmapHeight);
        for (FixedEntry entry : fixedEntries) {
            if (entry.dimension.equals(dimension)) {
                return new FixedHeight(entry.height);
            }
        };
        for (String entry : creationHeightEntries) {
            if (entry.equals(dimension)) {
                return creationHeight;
            }
        };
        if (!world.getDimension().hasCeiling()) {
            return heightmapHeight;
        }
        if (useMapCreationHeight) {
            return creationHeight;
        } else {
            return new FixedHeight(fixedHeight);
        }
    };
}

class FixedEntry {
    
    String dimension;
    int height;

    public FixedEntry() {
        dimension = "";
        height = 100;
    }

    public FixedEntry(String dimension, int height) {
        this.dimension = dimension;
        this.height = height;
    }
}