package emoji

import (
	"fmt"
	"strings"
)

// Map returns the emoji at the provided position.
// This list is from 0-255
func Map(b byte) Words {
	return mapGen.EmojiWords[int(b)]
}

// Version returns the version of the emojisum document currently compiled
// against
func Version() string {
	return mapGen.Version
}

var mapGen VersionedMap

// VersionedMap is the structure used for the `emojimap.json` document
type VersionedMap struct {
	Description string `json:"description"`
	Version     string `json:"version"`
	// these are an ordered list, referened by a byte (each byte of a checksum digest)
	EmojiWords []Words `json:"emojiwords"`
}

// Words are a set of options to represent an emoji.
// Possible options could be the ":colon_notation:" or a "U+26CF" style codepoint.
type Words []string

// IsColonNotation checks for whether a word is the :colon_notation: of emoji
func IsColonNotation(word string) bool {
	return strings.HasPrefix(word, ":") && strings.HasSuffix(word, ":")
}

// IsCodepoint checks for whether a word is the "U+1234" codepoint style of emoji
func IsCodepoint(word string) bool {
	return strings.HasPrefix(strings.ToUpper(word), "U+")
}

var unicodeURL = `http://www.unicode.org/emoji/charts/full-emoji-list.html`

// UnicodeLink returns a link to unicode.org list for CodePoint, or just the
// full list if not a codepoint
func UnicodeLink(word string) string {
	if !IsCodepoint(word) {
		return unicodeURL
	}
	return fmt.Sprintf("%s#%s", unicodeURL, strings.SplitN(strings.ToLower(word), "+", 2)[1])
}
