package token

import "fmt"

var SingleByteTokens = [...]string{"", "", "", "200", "400", "404", "500", "501", "502", "action", "add",
	"after", "archive", "author", "available", "battery", "before", "body",
	"broadcast", "chat", "clear", "code", "composing", "contacts", "count",
	"create", "debug", "delete", "demote", "duplicate", "encoding", "error",
	"false", "filehash", "from", "g.us", "group", "groups_v2", "height", "id",
	"image", "in", "index", "invis", "item", "jid", "kind", "last", "leave",
	"live", "log", "media", "message", "mimetype", "missing", "modify", "name",
	"notification", "notify", "out", "owner", "participant", "paused",
	"picture", "played", "presence", "preview", "promote", "query", "raw",
	"read", "receipt", "received", "recipient", "recording", "relay",
	"remove", "response", "resume", "retry", "s.whatsapp.net", "seconds",
	"set", "size", "status", "subject", "subscribe", "t", "text", "to", "true",
	"type", "unarchive", "unavailable", "url", "user", "value", "web", "width",
	"mute", "read_only", "admin", "creator", "short", "update", "powersave",
	"checksum", "epoch", "block", "previous", "409", "replaced", "reason",
	"spam", "modify_tag", "message_info", "delivery", "emoji", "title",
	"description", "canonical-url", "matched-text", "star", "unstar",
	"media_key", "filename", "identity", "unread", "page", "page_count",
	"search", "media_message", "security", "call_log", "profile", "ciphertext",
	"invite", "gif", "vcard", "frequent", "privacy", "blacklist", "whitelist",
	"verify", "location", "document", "elapsed", "revoke_invite", "expiration",
	"unsubscribe", "disable", "vname", "old_jid", "new_jid", "announcement",
	"locked", "prop", "label", "color", "call", "offer", "call-id",
	"quick_reply", "sticker", "pay_t", "accept", "reject", "sticker_pack",
	"invalid", "canceled", "missed", "connected", "result", "audio",
	"video", "recent"}

var doubleByteTokens = [...]string{}

func GetSingleToken(i int) (string, error) {
	if i < 3 || i >= len(SingleByteTokens) {
		return "", fmt.Errorf("index out of single byte token bounds %d", i)
	}

	return SingleByteTokens[i], nil
}

func GetDoubleToken(index1 int, index2 int) (string, error) {
	n := 256*index1 + index2
	if n < 0 || n >= len(doubleByteTokens) {
		return "", fmt.Errorf("index out of double byte token bounds %d", n)
	}

	return doubleByteTokens[n], nil
}

func IndexOfSingleToken(token string) int {
	for i, t := range SingleByteTokens {
		if t == token {
			return i
		}
	}

	return -1
}

const (
	LIST_EMPTY   = 0
	STREAM_END   = 2
	DICTIONARY_0 = 236
	DICTIONARY_1 = 237
	DICTIONARY_2 = 238
	DICTIONARY_3 = 239
	LIST_8       = 248
	LIST_16      = 249
	JID_PAIR     = 250
	HEX_8        = 251
	BINARY_8     = 252
	BINARY_20    = 253
	BINARY_32    = 254
	NIBBLE_8     = 255
)

const (
	PACKED_MAX      = 254
	SINGLE_BYTE_MAX = 256
)