package namegen

import (
	"crypto/rand"
	"encoding/binary"
)

var adjectives = []string{
	"ace", "apt", "fit", "fun", "odd", "top", "able", "beau", "bold", "calm",
	"chic", "cool", "deep", "deft", "easy", "epic", "fair", "fine", "free", "full",
	"game", "glad", "glow", "good", "holy", "keen", "kind", "lean", "mild", "neat",
	"nice", "open", "pure", "real", "snug", "spry", "tidy", "true", "warm", "wavy",
	"wise", "adept", "agile", "alert", "alive", "ample", "angel", "awake", "aware", "brave",
	"brisk", "chill", "clean", "clear", "close", "comic", "eager", "elite", "first", "fleet",
	"fresh", "grace", "grand", "great", "happy", "hardy", "ideal", "jolly", "light", "lithe",
	"loyal", "lucid", "lucky", "lunar", "magic", "merry", "nifty", "noble", "peppy", "perky",
	"proud", "quick", "quiet", "ready", "regal", "savvy", "sharp", "smart", "solid", "sound",
	"sunny", "super", "sweet", "swift", "vivid", "witty", "zesty",
}

var substantives = []string{
	"ox", "aim", "air", "arm", "bud", "day", "hay", "jam", "jay", "joy",
	"key", "map", "may", "nod", "ore", "pen", "sky", "sun", "way", "zen",
	"ant", "ape", "auk", "bat", "bee", "cat", "cod", "cow", "dog", "elk",
	"fox", "hen", "owl", "pig", "ram", "rat", "yak", "boar", "buck", "bull",
	"calf", "carp", "crab", "crow", "deer", "dove", "fish", "foal", "frog", "goat",
	"gull", "hare", "hawk", "ibex", "kiwi", "kudu", "lamb", "lion", "lynx", "mink",
	"mole", "mule", "newt", "orca", "oryx", "puma", "seal", "slug", "stag", "swan",
	"tern", "toad", "tuna", "wasp", "wolf", "zebu", "bison", "camel", "crane", "eagle",
	"finch", "goose", "heron", "hippo", "horse", "hyena", "koala", "llama", "macaw", "moose",
	"otter", "quail", "raven", "robin", "shark", "sheep", "shrew", "skunk", "sloth", "snail",
	"squid", "tapir", "tiger", "trout", "whale", "zebra", "ally", "arch", "area", "aura",
	"axis", "bank", "barn", "beam", "bell", "belt", "bend", "bird", "boat", "bond",
	"book", "boot", "bowl", "brim", "calm", "camp", "card", "care", "cell", "city",
	"clan", "club", "code", "core", "crux", "dawn", "deal", "film", "firm", "flag",
	"flow", "foam", "gate", "gift", "glow", "hall", "hand", "harp", "hill", "home",
	"hope", "host", "idea", "isle", "item", "keel", "knot", "land", "leaf", "link",
	"lion", "loom", "love", "luck", "mark", "moon", "moss", "nook", "note", "pact",
	"page", "path", "peak", "poem", "port", "ring", "road", "rock", "roof", "rule",
	"sail", "seal", "seed", "song", "star", "tide", "tree", "tune", "walk", "ward",
	"wave", "well", "wind", "wing", "wish", "wood", "work", "zone", "amity", "asset",
	"bloom", "brook", "bunch", "charm", "chart", "cheer", "chord", "cliff", "cloud", "coast",
	"comet", "craft", "crane", "crest", "crowd", "crown", "cycle", "faith", "field", "flame",
	"fleet", "focus", "forge", "frame", "fruit", "glade", "grace", "grain", "grove", "guide",
	"guild", "haven", "heart", "honey", "honor", "humor", "image", "index", "jewel", "judge",
	"kudos", "lumen", "lunar", "magic", "march", "marsh", "mercy", "model", "moral", "music",
	"niche", "oasis", "ocean", "opera", "orbit", "order", "peace", "pearl", "petal", "phase",
	"piano", "pilot", "place", "plaza", "prism", "proof", "pulse", "quest", "quiet", "quill",
	"radar", "rally", "range", "realm", "reign", "river", "route", "scene", "scope", "score",
	"shade", "shape", "shore", "skill", "spark", "spice", "spire", "spoke", "stone", "story",
	"table", "token", "trend", "tribe", "trust", "unity", "valor", "value", "verse", "vista",
	"voice", "world",
}

func Generate() string {
	if len(adjectives) == 0 || len(substantives) == 0 {
		return ""
	}
	return adjectives[randomIndex(len(adjectives))] + "-" + substantives[randomIndex(len(substantives))]
}

func randomIndex(length int) int {
	if length <= 1 {
		return 0
	}
	var buf [8]byte
	if _, err := rand.Read(buf[:]); err != nil {
		return 0
	}
	return int(binary.BigEndian.Uint64(buf[:]) % uint64(length))
}
