/**
 * Random word slug generator for plan IDs
 * Inspired by https://github.com/nas5w/random-word-slugs
 * with SANDCODE-flavored words
 */
import { randomBytes } from 'crypto'

// Adjectives for slug generation - whimsical and delightful
const ADJECTIVES = [
  // Classic pleasant adjectives
  'abundant',
  'ancient',
  'bright',
  'calm',
  'cheerful',
  'clever',
  'cozy',
  'curious',
  'dapper',
  'dazzling',
  'deep',
  'delightful',
  'eager',
  'elegant',
  'enchanted',
  'fancy',
  'fluffy',
  'gentle',
  'gleaming',
  'golden',
  'graceful',
  'happy',
  'hidden',
  'humble',
  'jolly',
  'joyful',
  'keen',
  'kind',
  'lively',
  'lovely',
  'lucky',
  'luminous',
  'magical',
  'majestic',
  'mellow',
  'merry',
  'mighty',
  'misty',
  'noble',
  'peaceful',
  'playful',
  'polished',
  'precious',
  'proud',
  'quiet',
  'quirky',
  'radiant',
  'rosy',
  'serene',
  'shiny',
  'silly',
  'sleepy',
  'smooth',
  'snazzy',
  'snug',
  'snuggly',
  'soft',
  'sparkling',
  'spicy',
  'splendid',
  'sprightly',
  'starry',
  'steady',
  'sunny',
  'swift',
  'tender',
  'tidy',
  'toasty',
  'tranquil',
  'twinkly',
  'valiant',
  'vast',
  'velvet',
  'vivid',
  'warm',
  'whimsical',
  'wild',
  'wise',
  'witty',
  'wondrous',
  'zany',
  'zesty',
  'zippy',
  // Whimsical / magical
  'breezy',
  'bubbly',
  'buzzing',
  'cheeky',
  'cosmic',
  'cozy',
  'crispy',
  'crystalline',
  'cuddly',
  'drifting',
  'dreamy',
  'effervescent',
  'ethereal',
  'fizzy',
  'flickering',
  'floating',
  'floofy',
  'fluttering',
  'foamy',
  'frolicking',
  'fuzzy',
  'giggly',
  'glimmering',
  'glistening',
  'glittery',
  'glowing',
  'goofy',
  'groovy',
  'harmonic',
  'hazy',
  'humming',
  'iridescent',
  'jaunty',
  'jazzy',
  'jiggly',
  'melodic',
  'moonlit',
  'mossy',
  'nifty',
  'peppy',
  'prancy',
  'purrfect',
  'purring',
  'quizzical',
  'rippling',
  'rustling',
  'shimmering',
  'shimmying',
  'snappy',
  'snoopy',
  'squishy',
  'swirling',
  'ticklish',
  'tingly',
  'twinkling',
  'velvety',
  'wiggly',
  'wobbly',
  'woolly',
  'zazzy',
  // Programming concepts
  'abstract',
  'adaptive',
  'agile',
  'async',
  'atomic',
  'binary',
  'cached',
  'compiled',
  'composed',
  'compressed',
  'concurrent',
  'cryptic',
  'curried',
  'declarative',
  'delegated',
  'distributed',
  'dynamic',
  'eager',
  'elegant',
  'encapsulated',
  'enumerated',
  'eventual',
  'expressive',
  'federated',
  'functional',
  'generic',
  'greedy',
  'hashed',
  'idempotent',
  'immutable',
  'imperative',
  'indexed',
  'inherited',
  'iterative',
  'lazy',
  'lexical',
  'linear',
  'linked',
  'logical',
  'memoized',
  'modular',
  'mutable',
  'nested',
  'optimized',
  'parallel',
  'parsed',
  'partitioned',
  'piped',
  'polymorphic',
  'pure',
  'reactive',
  'recursive',
  'refactored',
  'reflective',
  'replicated',
  'resilient',
  'robust',
  'scalable',
  'sequential',
  'serialized',
  'sharded',
  'sorted',
  'staged',
  'stateful',
  'stateless',
  'streamed',
  'structured',
  'synchronous',
  'synthetic',
  'temporal',
  'transient',
  'typed',
  'unified',
  'validated',
  'vectorized',
  'virtual',
] as const

// Nouns for slug generation - whimsical creatures, nature, and fun objects
const NOUNS = [
  // Nature & cosmic
  'aurora',
  'avalanche',
  'blossom',
  'breeze',
  'brook',
  'bubble',
  'canyon',
  'cascade',
  'cloud',
  'clover',
  'comet',
  'coral',
  'cosmos',
  'creek',
  'crescent',
  'crystal',
  'dawn',
  'dewdrop',
  'dusk',
  'eclipse',
  'ember',
  'feather',
  'fern',
  'firefly',
  'flame',
  'flurry',
  'fog',
  'forest',
  'frost',
  'galaxy',
  'garden',
  'glacier',
  'glade',
  'grove',
  'harbor',
  'horizon',
  'island',
  'lagoon',
  'lake',
  'leaf',
  'lightning',
  'meadow',
  'meteor',
  'mist',
  'moon',
  'moonbeam',
  'mountain',
  'nebula',
  'nova',
  'ocean',
  'orbit',
  'pebble',
  'petal',
  'pine',
  'planet',
  'pond',
  'puddle',
  'quasar',
  'rain',
  'rainbow',
  'reef',
  'ripple',
  'river',
  'shore',
  'sky',
  'snowflake',
  'spark',
  'spring',
  'star',
  'stardust',
  'starlight',
  'storm',
  'stream',
  'summit',
  'sun',
  'sunbeam',
  'sunrise',
  'sunset',
  'thunder',
  'tide',
  'twilight',
  'valley',
  'volcano',
  'waterfall',
  'wave',
  'willow',
  'wind',
  // Cute creatures
  'alpaca',
  'axolotl',
  'badger',
  'bear',
  'beaver',
  'bee',
  'bird',
  'bumblebee',
  'bunny',
  'cat',
  'chipmunk',
  'crab',
  'crane',
  'deer',
  'dolphin',
  'dove',
  'dragon',
  'dragonfly',
  'duckling',
  'eagle',
  'elephant',
  'falcon',
  'finch',
  'flamingo',
  'fox',
  'frog',
  'giraffe',
  'goose',
  'hamster',
  'hare',
  'hedgehog',
  'hippo',
  'hummingbird',
  'jellyfish',
  'kitten',
  'koala',
  'ladybug',
  'lark',
  'lemur',
  'llama',
  'lobster',
  'lynx',
  'manatee',
  'meerkat',
  'moth',
  'narwhal',
  'newt',
  'octopus',
  'otter',
  'owl',
  'panda',
  'parrot',
  'peacock',
  'pelican',
  'penguin',
  'phoenix',
  'piglet',
  'platypus',
  'pony',
  'porcupine',
  'puffin',
  'puppy',
  'quail',
  'quokka',
  'rabbit',
  'raccoon',
  'raven',
  'robin',
  'salamander',
  'seahorse',
  'seal',
  'sloth',
  'snail',
  'sparrow',
  'sphinx',
  'squid',
  'squirrel',
  'starfish',
  'swan',
  'tiger',
  'toucan',
  'turtle',
  'unicorn',
  'walrus',
  'whale',
  'wolf',
  'wombat',
  'wren',
  'yeti',
  'zebra',
  // Fun objects & concepts
  'acorn',
  'anchor',
  'balloon',
  'beacon',
  'biscuit',
  'blanket',
  'bonbon',
  'book',
  'boot',
  'cake',
  'candle',
  'candy',
  'castle',
  'charm',
  'clock',
  'cocoa',
  'cookie',
  'crayon',
  'crown',
  'cupcake',
  'donut',
  'dream',
  'fairy',
  'fiddle',
  'flask',
  'flute',
  'fountain',
  'gadget',
  'gem',
  'gizmo',
  'globe',
  'goblet',
  'hammock',
  'harp',
  'haven',
  'hearth',
  'honey',
  'journal',
  'kazoo',
  'kettle',
  'key',
  'kite',
  'lantern',
  'lemon',
  'lighthouse',
  'locket',
  'lollipop',
  'mango',
  'map',
  'marble',
  'marshmallow',
  'melody',
  'mitten',
  'mochi',
  'muffin',
  'music',
  'nest',
  'noodle',
  'oasis',
  'origami',
  'pancake',
  'parasol',
  'peach',
  'pearl',
  'pebble',
  'pie',
  'pillow',
  'pinwheel',
  'pixel',
  'pizza',
  'plum',
  'popcorn',
  'pretzel',
  'prism',
  'pudding',
  'pumpkin',
  'puzzle',
  'quiche',
  'quill',
  'quilt',
  'riddle',
  'rocket',
  'rose',
  'scone',
  'scroll',
  'shell',
  'sketch',
  'snowglobe',
  'sonnet',
  'sparkle',
  'spindle',
  'sprout',
  'sundae',
  'swing',
  'taco',
  'teacup',
  'teapot',
  'thimble',
  'toast',
  'token',
  'tome',
  'tower',
  'treasure',
  'treehouse',
  'trinket',
  'truffle',
  'tulip',
  'umbrella',
  'waffle',
  'wand',
  'whisper',
  'whistle',
  'widget',
  'wreath',
  'zephyr',
  // Computer scientists
  'abelson',
  'adleman',
  'aho',
  'allen',
  'babbage',
  'bachman',
  'backus',
  'barto',
  'bengio',
  'bentley',
  'blum',
  'boole',
  'brooks',
  'catmull',
  'cerf',
  'cherny',
  'church',
  'clarke',
  'cocke',
  'codd',
  'conway',
  'cook',
  'corbato',
  'cray',
  'curry',
  'dahl',
  'diffie',
  'dijkstra',
  'dongarra',
  'eich',
  'emerson',
  'engelbart',
  'feigenbaum',
  'floyd',
  'gosling',
  'graham',
  'gray',
  'hamming',
  'hanrahan',
  'hartmanis',
  'hejlsberg',
  'hellman',
  'hennessy',
  'hickey',
  'hinton',
  'hoare',
  'hollerith',
  'hopcroft',
  'hopper',
  'iverson',
  'kahan',
  'kahn',
  'karp',
  'kay',
  'kernighan',
  'knuth',
  'kurzweil',
  'lamport',
  'lampson',
  'lecun',
  'lerdorf',
  'liskov',
  'lovelace',
  'matsumoto',
  'mccarthy',
  'metcalfe',
  'micali',
  'milner',
  'minsky',
  'moler',
  'moore',
  'naur',
  'neumann',
  'newell',
  'nygaard',
  'papert',
  'parnas',
  'pascal',
  'patterson',
  'pearl',
  'perlis',
  'pike',
  'pnueli',
  'rabin',
  'reddy',
  'ritchie',
  'rivest',
  'rossum',
  'russell',
  'scott',
  'sedgewick',
  'shamir',
  'shannon',
  'sifakis',
  'simon',
  'stallman',
  'stearns',
  'steele',
  'stonebraker',
  'stroustrup',
  'sutherland',
  'sutton',
  'tarjan',
  'thacker',
  'thompson',
  'torvalds',
  'turing',
  'ullman',
  'valiant',
  'wadler',
  'wall',
  'wigderson',
  'wilkes',
  'wilkinson',
  'wirth',
  'wozniak',
  'yao',
] as const

// Verbs for the middle word - whimsical action words
const VERBS = [
  'baking',
  'beaming',
  'booping',
  'bouncing',
  'brewing',
  'bubbling',
  'chasing',
  'churning',
  'coalescing',
  'conjuring',
  'cooking',
  'crafting',
  'crunching',
  'cuddling',
  'dancing',
  'dazzling',
  'discovering',
  'doodling',
  'dreaming',
  'drifting',
  'enchanting',
  'exploring',
  'finding',
  'floating',
  'fluttering',
  'foraging',
  'forging',
  'frolicking',
  'gathering',
  'giggling',
  'gliding',
  'greeting',
  'growing',
  'hatching',
  'herding',
  'honking',
  'hopping',
  'hugging',
  'humming',
  'imagining',
  'inventing',
  'jingling',
  'juggling',
  'jumping',
  'kindling',
  'knitting',
  'launching',
  'leaping',
  'mapping',
  'marinating',
  'meandering',
  'mixing',
  'moseying',
  'munching',
  'napping',
  'nibbling',
  'noodling',
  'orbiting',
  'painting',
  'percolating',
  'petting',
  'plotting',
  'pondering',
  'popping',
  'prancing',
  'purring',
  'puzzling',
  'questing',
  'riding',
  'roaming',
  'rolling',
  'sauteeing',
  'scribbling',
  'seeking',
  'shimmying',
  'singing',
  'skipping',
  'sleeping',
  'snacking',
  'sniffing',
  'snuggling',
  'soaring',
  'sparking',
  'spinning',
  'splashing',
  'sprouting',
  'squishing',
  'stargazing',
  'stirring',
  'strolling',
  'swimming',
  'swinging',
  'tickling',
  'tinkering',
  'toasting',
  'tumbling',
  'twirling',
  'waddling',
  'wandering',
  'watching',
  'weaving',
  'whistling',
  'wibbling',
  'wiggling',
  'wishing',
  'wobbling',
  'wondering',
  'yawning',
  'zooming',
] as const

/**
 * Generate a cryptographically random integer in the range [0, max)
 */
function randomInt(max: number): number {
  // Use crypto.randomBytes for better randomness than Math.random
  const bytes = randomBytes(4)
  const value = bytes.readUInt32BE(0)
  return value % max
}

/**
 * Pick a random element from an array
 */
function pickRandom<T>(array: readonly T[]): T {
  return array[randomInt(array.length)]!
}

/**
 * Generate a random word slug in the format "adjective-verb-noun"
 * Example: "gleaming-brewing-phoenix", "cosmic-pondering-lighthouse"
 */
export function generateWordSlug(): string {
  const adjective = pickRandom(ADJECTIVES)
  const verb = pickRandom(VERBS)
  const noun = pickRandom(NOUNS)
  return `${adjective}-${verb}-${noun}`
}

/**
 * Generate a shorter random word slug in the format "adjective-noun"
 * Example: "graceful-unicorn", "cosmic-lighthouse"
 */
export function generateShortWordSlug(): string {
  const adjective = pickRandom(ADJECTIVES)
  const noun = pickRandom(NOUNS)
  return `${adjective}-${noun}`
}
