﻿using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.Profiling;
using UtageExtensions;

namespace Utage
{
	//宴のTextMeshPro対応のタグ解析をさらにカスタムしてTextAnimatorに適用するクラス
	//下記のビルトインのタグに対応
	//https://www.febucci.com/text-animator-unity/docs/built-in-effects-list/
	public class TextParserForTextAnimator : TextMeshProTextParser
	{
		public TextParserForTextAnimator(string text, bool isParseParamOnly = false)
			: base(text, isParseParamOnly)
		{
		}
		//タグの解析。解析方法によってここをoverrideして処理
		protected override bool TryParseTag(int index, out int endIndex, out string tagName, out string tagArg)
		{
			bool result = base.TryParseTag(index, out endIndex, out tagName, out tagArg);
			if (result) return true;

			string name0 ="";
			string arg0 = "";
			//Behaviors系のタグを解析する処理
			endIndex = ParserUtil.ParseTag(
				OriginalText, index, 
				(name,arg)=>
				{
					bool ret = ParseTagTextAnimatorBehaviors(name, arg);
					if (ret)
					{
						name0 = name;
						arg0 = arg;
					}
					return ret;
				});
			if(endIndex != index ) return true;
			
			//タグの区切り記号として { と } を使って、Appearances用のタグを解析する処理
			endIndex = ParserUtil.ParseTag(
				'{', '}',ParserUtil.DefaultTagSeparator,
				OriginalText, index, 
				(name,arg)=>
				{
					bool ret = ParseTagTextAnimatorAppearances(name, arg);
					if (ret)
					{
						name0 = name;
						arg0 = arg;
					}
					return ret;
				});
			tagName =name0;
			tagArg = arg0;
			return endIndex != index;
		}
		
		//テキストアニメーター用のBehaviors用のタグ
		static readonly List<string> TextAnimatorBehaviorsTagTbl = new List<string>()
		{
			"pend","/pend",
			"dangle","/dangle",
			"fade","/fade",
			"rainb","/rainb",
			"rot","/rot",
			"bounce","/bounce",
			"slide","/slide",
			"swing","/swing",
			"wave","/wave",
			"incr","/incr",
			"shake","/shake",
			"wiggle","/wiggle",
		};

		//テキストアニメーターのBehaviors用のタグか
		protected bool ParseTagTextAnimatorBehaviors(string name,string arg)
		{
			if (TextAnimatorBehaviorsTagTbl.Contains(name))
			{
				return true;
			}
			return false;
		}

		//テキストアニメーターのAppearances用のタグ
		static readonly List<string> TextAnimatorAppearancesTagTbl = new List<string>()
		{
			"rot","/rot",
			"diagexp","/diagexp",
			"horiexp","/horiexp",
			"vertexp","/vertexp",
			"offset","/offset",
			"fade","/fade",
			"size","/size",
			"rdir","/rdir",
		};

		//テキストアニメーターのAppearances用のタグか
		protected bool ParseTagTextAnimatorAppearances(string name,string arg)
		{
			if (TextAnimatorAppearancesTagTbl.Contains(name))
			{
				return true;
			}
			return false;
		}
	}
}
