package com.gmail.val59000mc.scenarios.scenariolisteners;

import com.gmail.val59000mc.customitems.CraftsManager;
import com.gmail.val59000mc.scenarios.ScenarioListener;
import com.gmail.val59000mc.utils.VersionUtils;
import org.bukkit.Bukkit;
import org.bukkit.inventory.Recipe;
import org.bukkit.inventory.RecipeChoice;
import org.bukkit.inventory.ShapedRecipe;

import java.util.*;

public class UpsideDownCraftsListener extends ScenarioListener{

    @Override
    public void onEnable(){
        Iterator<Recipe> iterator = Bukkit.recipeIterator();
        Set<Recipe> upsideDownRecipes = new HashSet<>();
        Set<Recipe> removeRecipes = new HashSet<>();

        Recipe recipe;
        while (iterator.hasNext()){
            recipe = iterator.next();
            if (!(recipe instanceof ShapedRecipe)){
                continue;
            }

            upsideDownRecipes.add(getUpsideDownRecipeFor((ShapedRecipe) recipe));
            removeRecipes.add(recipe);
        }

        for (Recipe remove : removeRecipes){
            VersionUtils.getVersionUtils().removeRecipeFor(remove.getResult());
        }

        for (Recipe add : upsideDownRecipes){
            Bukkit.getServer().addRecipe(add);
        }
    }

    @Override
    public void onDisable(){
        Bukkit.resetRecipes();
        CraftsManager.loadBannedCrafts();
        CraftsManager.loadCrafts();
    }

    private ShapedRecipe getUpsideDownRecipeFor(ShapedRecipe recipe){
        ShapedRecipe upsideDown = VersionUtils.getVersionUtils().createShapedRecipe(recipe.getResult(), UUID.randomUUID().toString());
        upsideDown.shape(getUpsideDownShape(recipe.getShape()));

        Map<Character, RecipeChoice> recipeChoiceMap = recipe.getChoiceMap();
        for (char c : recipeChoiceMap.keySet()){
            upsideDown.setIngredient(c, recipeChoiceMap.get(c));
        }

        return upsideDown;
    }

    private String[] getUpsideDownShape(String[] shape){
        String[] upsideDown = new String[shape.length];

        for (int i = 0; i < shape.length; i++) {
            upsideDown[i] = getMirroredString(shape[shape.length-i-1]);
        }

        return upsideDown;
    }

    private String getMirroredString(String string){
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < string.length(); i++) {
            sb.append(string.charAt(string.length()-i-1));
        }

        return sb.toString();
    }

}