/*
 * This file is part of HoloAPI.
 *
 * HoloAPI is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * HoloAPI is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with HoloAPI.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.dsh105.holoapi.config;

import com.dsh105.commodus.config.Options;
import com.dsh105.commodus.config.YAMLConfig;

import java.util.HashMap;
import java.util.Map;

public class Settings extends Options {

    private HashMap<String, String> specialCharacters = new HashMap<>();

    public Settings(YAMLConfig config) {
        super(config);
    }

    private void prepareSpecialCharacters() {
        specialCharacters = new HashMap<>();
        String[] codes = {"x", "xx", "xxx", "xxxx", "/", "<3", ":)", ":(", "s", "*", "|"};
        String[] characters = {"2591", "2592", "2593", "2588", "26A1", "2764", "263A", "2639", "2600", "2605", "23B9"};

        for (int i = 0; i < codes.length && i < characters.length; i++) {
            specialCharacters.put("[" + codes[i] + "]", characters[i]);
        }
    }

    @Override
    public void setDefaults() {
        for (Setting setting : Setting.getOptions(Settings.class, Setting.class)) {
            if (!setting.getPath().contains("%s")) {
                set(setting);
            }
        }

        // Special characters
        prepareSpecialCharacters();
        for (Map.Entry<String, String> entry : specialCharacters.entrySet()) {
            set(SPECIAL_CHARACTER.getPath(entry.getKey()), entry.getValue());
        }

        // Indicators
        String[] types = {"damage", "potion", "gainHealth", "exp"};
        String[] damageTypes = {"drowning", "fire", "magic", "poison", "starvation", "thorns", "wither"};
        String[] potionTypes = {"speed", "slow", "fast_digging", "slow_digging", "increase_damage", "heal", "harm", "jump", "confusion", "regeneration", "damage_resistance", "fire_resistance", "water_breathing", "invisibility", "blindness", "night_vision", "hunger", "weakness", "poison", "wither", "health_boost", "absorption", "saturation"};

        for (String indicatorType : types) {
            set(INDICATOR_ENABLE, indicatorType);
            set(INDICATOR_Y_OFFSET, indicatorType);
            set(INDICATOR_TIME_VISIBLE, indicatorType);
            set(INDICATOR_FORMAT, indicatorType, "default");
            if (!indicatorType.equalsIgnoreCase("EXP")) {
                set(INDICATOR_SHOW_FOR_PLAYERS, indicatorType);
                set(INDICATOR_SHOW_FOR_MOBS, indicatorType);
            }
        }

        set(INDICATOR_FORMAT.getPath("damage", "default"), "&c&l");
        for (String damageType : damageTypes) {
            set(INDICATOR_ENABLE_TYPE, "damage", damageType);
            set(INDICATOR_FORMAT.getPath("damage", damageType), "&c&l");
        }

        for (String potionType : potionTypes) {
            set(INDICATOR_FORMAT.getPath("potion", potionType), "&e&l %effect% %amp%");
        }
        set(INDICATOR_FORMAT.getPath("potion", "goldenapple"), "&e&l+ %effect%");
        set(INDICATOR_FORMAT.getPath("potion", "godapple"), "&e&l+ %effect% II");
    }

    public static final Setting<Boolean> DEBUGGING_ENABLED = new Setting<Boolean>("debugging.enabled", false);
    public static final Setting<Integer> DEBUGGING_LEVEL = new Setting<Integer>("debugging.level", 10);

    public static final Setting<String> COMMAND = new Setting<>("command", "holo");
    public static final Setting<Boolean> USE_BUNGEE = new Setting<>("bungecord", false);
    public static final Setting<Boolean> AUTO_UPDATE = new Setting<>("autoUpdate", false);
    public static final Setting<Boolean> CHECK_FOR_UPDATES = new Setting<>("checkForUpdates", true);

    public static final Setting<String> BASE_CHAT_COLOUR = new Setting<>("baseChatColour", "3");
    public static final Setting<String> HIGHLIGHT_CHAT_COLOUR = new Setting<>("highlightChatColour", "b");

    public static final Setting<Double> VERTICAL_LINE_SPACING = new Setting<>("verticalLineSpacing", 0.25D);

    public static final Setting<String> TRANSPARENCY_WITH_BORDER = new Setting<>("transparency.withBorder", " &r ");
    public static final Setting<String> TRANSPARENCY_WITHOUT_BORDER = new Setting<>("transparency.noBorder", " ");

    public static final Setting<Integer> TIMEZONE_OFFSET = new Setting<>("timezone.offset", 0);
    public static final Setting<Boolean> TIMEZONE_SHOW_ZONE_MARKER = new Setting<>("timezone.showZoneMarker", true);

    public static final Setting<String> MULTICOLOR_CHARACTER = new Setting<>("multicolorFormat.character", "&s");
    public static final Setting<String> MULTICOLOR_COLOURS = new Setting<>("multicolorFormat.colours", "&d,&5,&1,&9,&b,&a,&e,&6,&c,&3");
    public static final Setting<Integer> MULTICOLOR_DELAY = new Setting<>("multicolorFormat.delay", 5);

    public static final Setting<Boolean> CHATBUBBLES_SHOW = new Setting<>("chatBubbles.show", false);
    public static final Setting<Boolean> CHATBUBBLES_RISE = new Setting<>("chatBubbles.rise", true);
    public static final Setting<Boolean> CHATBUBBLES_FOLLOW_PLAYER = new Setting<>("chatBubbles.followPlayer", true);
    public static final Setting<Boolean> CHATBUBBLES_SHOW_PLAYER_NAME = new Setting<>("chatBubbles.showPlayerName", true);
    public static final Setting<String> CHATBUBBLES_NAME_FORMAT = new Setting<>("chatBubbles.nameFormat", "&6&o");
    public static final Setting<Integer> CHATBUBBLES_DISPLAY_DURATION = new Setting<>("chatBubbles.displayDurationSeconds", 8);
    public static final Setting<Integer> CHATBUBBLES_CHARACTERS_PER_LINE = new Setting<>("chatBubbles.charactersPerLine", 30);
    public static final Setting<Double> CHATBUBBLES_DISTANCE_ABOVE = new Setting<>("chatBubbles.distanceAbovePlayerTag", 0.5D);

    public static final Setting<Double> SPECIAL_CHARACTER = new Setting<>("specialCharacters.%s", 0.5D);

    public static final Setting<Boolean> INDICATOR_ENABLE = new Setting<>("indicators.%s.enable", false);
    public static final Setting<Boolean> INDICATOR_ENABLE_TYPE = new Setting<>("indicators.%s.enableType.%s", true);
    public static final Setting<Double> INDICATOR_Y_OFFSET = new Setting<>("indicators.%s.yOffset", 2D);
    public static final Setting<Integer> INDICATOR_TIME_VISIBLE = new Setting<>("indicators.%s.timeVisible", 4);
    public static final Setting<String> INDICATOR_FORMAT = new Setting<>("indicators.%s.format.%s", "&a&l");
    public static final Setting<Boolean> INDICATOR_SHOW_FOR_PLAYERS = new Setting<>("indicators.%s.showForPlayers", true);
    public static final Setting<Boolean> INDICATOR_SHOW_FOR_MOBS = new Setting<>("indicators.%s.showForMobs", true);
}