package data

import "github.com/volker-schukai/tokenizer"

const (
	PipeSymbol = iota + 1 // |
	PipeCmdDelimiter
	PipeQuote
	PipeReflectionIsNil

	PipeCmdStatic
	PipeCmdIndex
	PipeCmdPath
	PipeCmdToUpper
	PipeCmdToLower
	PipeCmdEmpty
	PipeCmdEquals
	PipeCmdTrim
	PipeCmdRawUrlEncode
	PipeCmdNot
	PipeCmdToInteger
	PipeCmdToString
	PipeCmdToFloat
	PipeCmdToBoolean
	PipeCmdToNumber
	PipeCmdToJSON
	PipeCmdFromJSON
	PipeCmdUCFirst
	PipeCmdUCWords
	PipeCmdLength
	PipeCmdBase64Encode
	PipeCmdBase64Decode
	PipeCmdHTMLSpecialChars
	PipeCmdHTMLEntityEncode
	PipeCmdHTMLEntityDecode
	PipeCmdPlaintext
	PipeCmdMD5
	PipeCmdSHA1
	PipeCmdSHA256
	PipeCmdSplit
	PipeCmdReplace
	PipeCmdJoin
	PipeCmdNop
	PipeCmdStringPad
	PipeCmdStringRepeat
	PipeCmdReverse
	PipeCmdSubstring
	PipeCmdWordwrap
	PipeCmdPrefix
	PipeCmdSuffix
	PipeCmdUrlEncode
	PipeCmdUrlDecode
	PipeCmdChar
	PipeCmdFloor
	PipeCmdCeil
	PipeCmdRound
	PipeCmdAdd
	PipeCmdSubtract
	PipeCmdMultiply
	PipeCmdDivide
	PipeCmdModulo
)

func initTokenizer() *tokenizer.Tokenizer {
	parser := tokenizer.New()
	parser.AllowKeywordUnderscore().AllowNumbersInKeyword()
	parser.DefineTokens(PipeSymbol, []string{"|"})
	parser.DefineTokens(PipeCmdDelimiter, []string{":"})

	parser.DefineTokens(PipeCmdStatic, []string{"static"})
	parser.DefineTokens(PipeCmdIndex, []string{"index", "dataset"})
	parser.DefineTokens(PipeCmdPath, []string{"path"})

	parser.DefineTokens(PipeReflectionIsNil, []string{"isnull", "isnil"})
	parser.DefineTokens(PipeCmdNop, []string{"nop"})

	parser.DefineTokens(PipeCmdEquals, []string{"eq", "equals", "equal", "?"}) // tested
	parser.DefineTokens(PipeCmdEmpty, []string{"empty"})                       // tested
	parser.DefineTokens(PipeCmdNot, []string{"not", "!"})                      // tested

	parser.DefineTokens(PipeCmdToInteger, []string{"tointeger", "int", "toint"}) // tested
	parser.DefineTokens(PipeCmdToString, []string{"tostring", "str"})
	parser.DefineTokens(PipeCmdToFloat, []string{"tofloat", "float"})
	parser.DefineTokens(PipeCmdToBoolean, []string{"toboolean", "tobool", "bool"})
	parser.DefineTokens(PipeCmdToNumber, []string{"tonumber", "number"})

	parser.DefineTokens(PipeCmdToJSON, []string{"tojson", "json", "encodejson", "jsonencode"})
	parser.DefineTokens(PipeCmdFromJSON, []string{"fromjson", "decodejson", "jsondecode"})

	parser.DefineTokens(PipeCmdToUpper, []string{"toupper", "upper", "strtoupper"}) // tested
	parser.DefineTokens(PipeCmdToLower, []string{"tolower", "lower", "strtolower"}) // tested

	parser.DefineTokens(PipeCmdChar, []string{"char", "chr"})
	parser.DefineTokens(PipeCmdFloor, []string{"floor", "rounddown"})
	parser.DefineTokens(PipeCmdCeil, []string{"ceil", "roundup"})
	parser.DefineTokens(PipeCmdRound, []string{"round"})
	parser.DefineTokens(PipeCmdAdd, []string{"add", "+"})
	parser.DefineTokens(PipeCmdSubtract, []string{"subtract", "sub", "-"})
	parser.DefineTokens(PipeCmdMultiply, []string{"multiply", "mul", "*"})
	parser.DefineTokens(PipeCmdDivide, []string{"divide", "div", "/"})
	parser.DefineTokens(PipeCmdModulo, []string{"modulo", "mod", "%"})

	parser.DefineTokens(PipeCmdUrlEncode, []string{"urlencoded", "urlencode", "url_encode"})
	parser.DefineTokens(PipeCmdUrlDecode, []string{"urldecoded", "urldecoded", "url_decode"})
	parser.DefineTokens(PipeCmdRawUrlEncode, []string{"rawurlencode", "rawurlencoded"})
	parser.DefineTokens(PipeCmdUCFirst, []string{"ucfirst", "ucfirst"})
	parser.DefineTokens(PipeCmdUCWords, []string{"ucwords", "ucwords"})
	parser.DefineTokens(PipeCmdLength, []string{"length", "len"})
	parser.DefineTokens(PipeCmdBase64Encode, []string{"base64encode", "base64_encode", "base64"})
	parser.DefineTokens(PipeCmdBase64Decode, []string{"base64decode", "base64_decode"})
	parser.DefineTokens(PipeCmdHTMLSpecialChars, []string{"htmlspecialchars", "html_special_chars"})
	parser.DefineTokens(PipeCmdHTMLEntityEncode, []string{"htmlentities", "html_entity_encode"})
	parser.DefineTokens(PipeCmdHTMLEntityDecode, []string{"html_entity_decode", "html_entity_decode"})
	parser.DefineTokens(PipeCmdPlaintext, []string{"plaintext", "text", "plain", "strip_tags"})
	parser.DefineTokens(PipeCmdTrim, []string{"trim"})
	parser.DefineTokens(PipeCmdMD5, []string{"md5"})
	parser.DefineTokens(PipeCmdSHA1, []string{"sha1"})
	parser.DefineTokens(PipeCmdSHA256, []string{"sha256"})
	parser.DefineTokens(PipeCmdStringPad, []string{"strpad", "stringpad"})
	parser.DefineTokens(PipeCmdStringRepeat, []string{"strrepeat", "stringrepeat"})
	parser.DefineTokens(PipeCmdReverse, []string{"reverse", "strrev"})
	parser.DefineTokens(PipeCmdSubstring, []string{"substr", "substring"})
	parser.DefineTokens(PipeCmdWordwrap, []string{"wordwrap"})
	parser.DefineTokens(PipeCmdPrefix, []string{"prefix"})
	parser.DefineTokens(PipeCmdSuffix, []string{"suffix"})
	parser.DefineTokens(PipeCmdSplit, []string{"split"})
	parser.DefineTokens(PipeCmdReplace, []string{"replace"})

	parser.DefineTokens(PipeCmdJoin, []string{"join"})

	parser.DefineStringToken(PipeQuote, `"`, `"`).SetEscapeSymbol(tokenizer.BackSlash)
	return parser
}