package speiger.src.coreengine.rendering.guiOld.renderer.provider;

import com.google.gson.JsonObject;

import speiger.src.coreengine.rendering.guiOld.renderer.IFontRenderer.CharInstance;
import speiger.src.coreengine.rendering.texturesOld.base.ITexture;
import speiger.src.coreengine.utils.helpers.JsonUtil;

public interface IFontProvider
{
	public ITexture getTexture();
	public boolean isCharacterValid(int codePoint);
	public CharInstance getCharacter(int codePoint, boolean bold);
	public float height();
	public float baseLine();
	
	public float getSpaceWidth();
	public float getTabWidth();
	
	public void destroy();
	
	public static class FontInfo
	{
		public int textureWidth;
		public int textureHeight;
		public float fontHeight;
		public float fontBase;
		public int tabs;
		
		public FontInfo(JsonObject obj)
		{
			this(obj.get("width").getAsInt(), obj.get("height").getAsInt(), obj.get("charHeight").getAsInt(), obj.get("base").getAsInt(), JsonUtil.getOrDefault(obj, "tabs", 4));
		}
		
		public FontInfo(int textureWidth, int textureHeight, float fontHeight, float fontBase, int tabs)
		{
			this.textureWidth = textureWidth;
			this.textureHeight = textureHeight;
			this.fontHeight = fontHeight;
			this.fontBase = fontBase;
			this.tabs = tabs;
		}
		
		public float setDesiredHeight(float desired)
		{
			float multiplier = desired / fontHeight;
			fontHeight *= multiplier;
			fontBase *= multiplier;
			return multiplier;
		}
		
		public CharInstance create(JsonObject obj)
		{
			return create(obj.get("char").getAsInt(), obj.get("minX").getAsInt(), obj.get("minY").getAsInt(), obj.get("maxX").getAsInt(), obj.get("maxY").getAsInt(), JsonUtil.getOrDefault(obj, "bold", false));
		}
		
		public CharInstance create(int character, int minX, int minY, int maxX, int maxY, boolean bold)
		{
			return new CharInstance(character, maxX - minX, maxY - minY, getTextureU(minX), getTextureV(minY), getTextureU(maxX), getTextureV(maxY), maxX - minX, bold);
		}
		
		public float getTextureU(float value)
		{
			return value / textureWidth;
		}
		
		public float getTextureV(float value)
		{
			return value / textureHeight;
		}
	}
}
