package slimeknights.toolleveling;

import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.util.text.translation.I18n;

import java.awt.*;
import java.util.List;

import slimeknights.tconstruct.library.client.CustomFontColor;
import slimeknights.tconstruct.library.utils.TinkerUtil;
import slimeknights.toolleveling.config.Config;

// utility class for constructing tooltip
public final class Tooltips {

  private Tooltips() {
  } // non-instantiable

  public static void addTooltips(ItemStack itemStack, List<String> tooltips) {
    NBTTagCompound tag = TinkerUtil.getModifierTag(itemStack, TinkerToolLeveling.modToolLeveling.getModifierIdentifier());
    if(!tag.hasNoTags()) {
      ToolLevelNBT data = new ToolLevelNBT(tag);
      if(Config.canLevelUp(data.level)) {
        tooltips.add(1, getXpToolTip(data.xp, TinkerToolLeveling.modToolLeveling.getXpForLevelup(data.level, itemStack)));
      }
      tooltips.add(1, getLevelTooltip(data.level));
    }
  }


  private static String getXpToolTip(int xp, int xpNeeded) {
    return String.format("%s: %s", I18n.translateToLocal("tooltip.xp"), getXpString(xp, xpNeeded));
  }

  private static String getXpString(int xp, int xpNeeded) {
    return TextFormatting.WHITE + String.format("%d / %d", xp, xpNeeded);
    //float xpPercentage = (float)xp / (float)xpNeeded * 100f;
    //return String.format("%.2f", xpPercentage) + "%"
  }

  private static String getLevelTooltip(int level) {
    return String.format("%s: %s", I18n.translateToLocal("tooltip.level"), getLevelString(level));
  }

  public static String getLevelString(int level) {
    return getLevelColor(level) + getRawLevelString(level) + TextFormatting.RESET;
  }

  private static String getRawLevelString(int level) {
    if(level <= 0) {
      return "";
    }

    // try a basic translated string
    if(I18n.canTranslate("tooltip.level." + level)) {
      return I18n.translateToLocal("tooltip.level." + level);
    }

    // ok. try to find a modulo
    int i = 1;
    while(I18n.canTranslate("tooltip.level." + i)) {
      i++;
    }

    // get the modulo'd string
    String str = I18n.translateToLocal("tooltip.level." + (level % i));
    // and add +s!
    for(int j = level / i; j > 0; j--) {
      str += '+';
    }

    return str;
  }

  private static String getLevelColor(int level) {
    float hue = (0.277777f * level);
    hue = hue - (int) hue;
    return CustomFontColor.encodeColor(Color.HSBtoRGB(hue, 0.75f, 0.8f));
        /* Old colors
        switch (level%12)
        {
            case 0: return TextFormatting.GRAY.toString();
            case 1: return TextFormatting.DARK_RED.toString();
            case 2: return TextFormatting.GOLD.toString();
            case 3: return TextFormatting.YELLOW.toString();
            case 4: return TextFormatting.DARK_GREEN.toString();
            case 5: return TextFormatting.DARK_AQUA.toString();
            case 6: return TextFormatting.LIGHT_PURPLE.toString();
            case 7: return TextFormatting.WHITE.toString();
            case 8: return TextFormatting.RED.toString();
            case 9: return TextFormatting.DARK_PURPLE.toString();
            case 10:return TextFormatting.AQUA.toString();
            case 11:return TextFormatting.GREEN.toString();
            default: return "";
        }*/
  }
}