<filename>random_names.py
#!/usr/bin/env python3


"""Return a random name.
   
   Name content copyright belongs to 
   [Sky Flourish](https://skyflourish.com).

   Support Sky Flourish by purchasing the 
   [Return of the Lazy DM](https://slyflourish.com/returnofthelazydm/).
"""

import os
import sys
import argparse
import timeit
from copy import copy
from random import shuffle


given_names = [
    "Sakib",
    "Jestan",
    "Natalie",
    "Lasus",
    "Teng",
    "Judithe",
    "Haina",
    "Raufe",
    "Hassan",
    "Valentin",
    "Wulfilda",
    "Pholos",
    "Gerbold",
    "Emeline",
    "Bidar",
    "Hamon",
    "Pan",
    "Caplan",
    "Pippa",
    "Elizabeta",
    "Reona",
    "Toas",
    "Lauda",
    "Abel",
    "Kapys",
    "Hadgu",
    "Beneger",
    "Roysia",
    "Demidra",
    "Eleazar",
    "Dorothe",
    "Rickeman",
    "Emerick",
    "Eldred",
    "Celeste",
    "Leone",
    "Sophia",
    "Amelia",
    "Resul",
    "Myles",
    "Abigail",
    "Ismenia",
    "Jediah",
    "Latona",
    "Simond",
    "Elliot",
    "Lettice",
    "Velic",
    "Powle",
    "Syndony",
    "Navarre",
    "Kadelon",
    "Khellus",
    "Zhen",
    "Reothine",
    "Gryfen",
    "Echo",
    "Wauter",
    "Mydrede",
    "Cornell",
    "Teukros",
    "Wyatt",
    "Keira",
    "Enis",
    "Henrietta",
    "Metope",
    "Richarde",
    "Gavin",
    "Liao",
    "Elonwey",
    "Tanah",
    "Hippote",
    "Alora",
    "Levi",
    "Aedith",
    "Halla",
    "Elsebee",
    "Redmond",
    "Guthrie",
    "Archedios",
    "Linoa",
    "Kynos",
    "Logan",
    "Esperaunce",
    "Littlejohn",
    "Karic",
    "Jonath",
    "Cunovin",
    "Yun",
    "Fulke",
    "Braya",
    "Holadamos",
    "Ophellia",
    "Cybele",
    "Cecily",
    "Athilla",
    "Sydney",
    "Kaitlyn",
    "Timothy",
    "Ogden",
    "Musa",
    "Admiranda",
    "Hepaklos",
    "Pullo",
    "Lysa",
    "Ophis",
    "Alkeme",
    "Anselem",
    "Ezib",
    "Wystan",
    "Symon",
    "Gared",
    "Bernaith",
    "Felice",
    "Bakis",
    "Kampe",
    "Jordyn",
    "Kalan",
    "Fauna",
    "Esmond",
    "Alyne",
    "Eschiva",
    "Ethelred",
    "Stella",
    "Joyse",
    "Katrine",
    "Zephyrus",
    "Hafza",
    "Edgar",
    "Sinope",
    "Nicholina",
    "Sabra",
    "Solece",
    "Callie",
    "Fahira",
    "Hildegard",
    "Bellamy",
    "Jordan",
    "Jolice",
    "Eugenia",
    "Phanes",
    "Mathys",
    "Paz",
    "Hylas",
    "Olyfe",
    "Hart",
    "Aelina",
    "Naida",
    "Somerchild",
    "Scarlett",
    "Galain",
    "Calloway",
    "Margeria",
    "Erebos",
    "Nora",
    "Orson",
    "Tearden",
    "Ierick",
    "Lorcan",
    "Tamsin",
    "Ivan",
    "Stewart",
    "Florens",
    "Aegipan",
    "Habiba",
    "Bukolos",
    "Freya",
    "Cashel",
    "Seada",
    "Muriel",
    "Clarimond",
    "Alexis",
    "Martine",
    "Arianna",
    "Bahta",
    "Lap",
    "Rhadine",
    "Cadya",
    "Galatia",
    "Minos",
    "Sydnee",
    "Landon",
    "Goddard",
    "Lambert",
    "Laurence",
    "Raoul",
    "Helvina",
    "Judye",
    "Adrian",
    "Pedias",
    "Galeos",
    "Norman",
    "Olivia",
    "Leukon",
    "Almir",
    "Carmen",
    "Halgan",
    "Randwulf",
    "Janbert",
    "Primeus",
    "Lily",
    "Brunhilde",
    "Merza",
    "Zacheus",
    "Morgan",
    "Avelyn",
    "Mestor",
    "Jeger",
    "Zineta",
    "Rebeccah",
    "Liliana",
    "Tarvorwen",
    "Cosmo",
    "Hemithea",
    "Trax",
    "Symond",
    "Kurtz",
    "Pelias",
    "Lowell",
    "Persa",
    "Kaylee",
    "Iamos",
    "Madison",
    "Fridgia",
    "Ahmet",
    "Xamso",
    "Cain",
    "Myrkenai",
    "Peny",
    "Clive",
    "Josia",
    "Brice",
    "Swif",
    "Adonis",
    "Daimbert",
    "Mathild",
    "Rose",
    "Denston",
    "Jaane",
    "Ingham",
    "Grifth",
    "Kenrick",
    "Kamran",
    "Teda",
    "Grayson",
    "Jillian",
    "Isylde",
    "Neria",
    "Emery",
    "Germainne",
    "Helenor",
    "Bran",
    "Breccan",
    "Melusine",
    "Kain",
    "Linyeve",
    "Poter",
    "Katherine",
    "Dominic",
    "Atropos",
    "Kaivan",
    "Oghrym",
    "Lanos",
    "Drake",
    "Micah",
    "Molos",
    "Banderon",
    "Havynn",
    "Hudson",
    "Lake",
    "Sigmund",
    "Bertram",
    "Abraham",
    "Wilfrid",
    "Morgayne",
    "Anaexia",
    "Maronne",
    "Mordrid",
    "Ambrosia",
    "Edelinne",
    "Eugene",
    "Shui",
    "Hilda",
    "Dodonna",
    "Agando",
    "Piter",
    "Folke",
    "Daanesh",
    "Orthia",
    "Jenyfer",
    "Dagim",
    "Boyle",
    "Maddeline",
    "Eliana",
    "Oswyn",
    "Dekelos",
    "Blake",
    "Ischys",
    "Khesrow",
    "Gregory",
    "Epione",
    "Trydwulf",
    "Minerva",
    "Kathe",
    "May",
    "Shizuko",
    "Karyl",
    "Elenor",
    "Arnette",
    "Cathie",
    "Tammera",
    "Margrett",
    "Josue",
    "Berihu",
    "Melesse",
]
surnames = [
    "Beastglove",
    "Glorystar",
    "Duskheart",
    "Goblincrippler",
    "Anvilhunter",
    "Mooncaster",
    "Hillmaster",
    "Jewelcaster",
    "Songchuckle",
    "Gravelchest",
    "Forgegiver",
    "Needlespur",
    "Ghostcloud",
    "Graysoother",
    "Ebonrazor",
    "Tornheart",
    "Duskdancer",
    "Broadhowler",
    "Spidertoes",
    "Felbelly",
    "Kingson",
    "Scalehair",
    "Starhowler",
    "Giantfang",
    "Bearsmile",
    "Bronzeknee",
    "Greenknocker",
    "Longhair",
    "Firespear",
    "Willowchewer",
    "Wyrmclaw",
    "Copperwind",
    "Gloomtoes",
    "Ebonhood",
    "Millblood",
    "Swordbane",
    "Goosefinger",
    "Moonstar",
    "Gloomhammer",
    "Wisefang",
    "Spidersmasher",
    "Foebeard",
    "Bronzecloud",
    "Drumwillow",
    "Riddlemaker",
    "Halfspear",
    "Iceknee",
    "Brightwhisper",
    "Northbound",
    "Foerazor",
    "Icebright",
    "Wormknocker",
    "Swordstorm",
    "Foeborn",
    "Gloryblade",
    "Gentleblood",
    "Dustchaser",
    "Crowsoother",
    "Darktraveler",
    "Whitehood",
    "Eagleson",
    "Halfrazor",
    "Goldrain",
    "Frostgaze",
    "Nightrend",
    "Harpkiss",
    "Giantsoother",
    "Ebonforger",
    "Traildancer",
    "Hillfang",
    "Dawntraveler",
    "Gloomtrail",
    "Catstinger",
    "Wolfouse",
    "Spirithand",
    "Mountaincleaver",
    "Coppersmasher",
    "Greenclaw",
    "Foxstorm",
    "Nightstinger",
    "Gemwing",
    "Glassforger",
    "Tallteeth",
    "Spelltouched",
    "Swordwing",
    "Darkgaze",
    "Wyrmglacier",
    "Tigerbeard",
    "Nightborn",
    "Gloryson",
    "Oxcutter",
    "Hawkborn",
    "Siegewalker",
    "Oakstalker",
    "Northrain",
    "Drakehunter",
    "Beastcaller",
    "Icecaller",
    "Willowsteel",
    "Tigersmasher",
    "Bluebeard",
    "Anvildancer",
    "Doommaker",
    "Gemblood",
    "Felheart",
    "Graytongue",
    "Shadowtooth",
    "Greenbottom",
    "Rainbrow",
    "Oakharp",
    "Flowerheart",
    "Emeraldforger",
    "Drakecloud",
    "Goosekick",
    "Songdancer",
    "Felhoof",
    "Moonsong",
    "Gentlebelly",
    "Earthglove",
    "Broadtooth",
    "Springwalker",
    "Needlebelly",
    "Ratchewer",
    "Strifetooth",
    "Dragonstinger",
    "Foxhowl",
    "Forgebane",
    "Halfeart",
    "Longwhisper",
    "Willowboot",
    "Doghunter",
    "Titanteeth",
    "Wolfsoul",
    "Shieldheart",
    "Greendazer",
    "Needletoes",
    "Hillbrow",
    "Whitefnger",
    "Iceglove",
    "Dawnwillow",
    "Redsong",
    "Lightwhisker",
    "Graverock",
    "Macefnger",
    "Drumsmasher",
    "Halfin",
    "Gemviper",
    "Faeriewhisper",
    "Millstone",
    "Ghoultalker",
    "Spiritstar",
    "Wyrmfinger",
    "Springwalker",
    "Graysong",
    "Leafouse",
    "Shieldstorm",
    "Firewind",
    "Goldseeker",
    "Titanchewer",
    "Northtongue",
    "Spinevalley",
    "Wyrmgazer",
    "Goosehood",
    "Tornstar",
    "Leafcaster",
    "Silvergust",
    "Forgehammer",
    "Sharpboot",
    "Shadowsoul",
    "Rainblade",
    "Tallheart",
    "Ironcrippler",
    "Frostslicer",
    "Kingstone",
    "Silvercutter",
    "Spellstinger",
    "Smilesteel",
    "Wolfwatcher",
    "Freechaser",
    "Ratbeard",
    "Foxsmile",
    "Trailwhisker",
    "Hillchaser",
    "Knifebright",
    "Leafound",
    "Wormbeard",
    "Angelheart",
    "Lawknocker",
    "Lionhunter",
    "Dusthide",
    "Stormsong",
    "Gloomsinger",
    "Darkcry",
    "Eaglecry",
    "Lightboot",
    "Wormblade",
    "Mountainbrow",
    "Wormtoes",
    "Hawkrunner",
    "Brightharp",
    "Crowheart",
    "Whitewalker",
    "Bluesoul",
    "Frostcleaver",
    "Spinetalker",
    "Flamehelm",
    "Crowlover",
    "Millsong",
    "Dirtbound",
    "Emeraldwind",
    "Quickwhisker",
    "Hollyfinger",
    "Doomglacier",
    "Wormstalker",
    "Ironbelly",
    "Moonteeth",
    "Oakstar",
    "Ghosttalker",
    "Goblincloak",
    "Spiderslicer",
    "Graymaker",
    "Goldthumb",
    "Wisehound",
    "Ironstalker",
    "Forgecloak",
    "Firewhisper",
    "Glassbuckle",
    "Starboard",
    "Stoneknee",
    "Moonspur",
    "Gravebright",
    "Spiritcowl",
    "Stonesoul",
]


def generate_names(given_names, surnames, length=1):
    _given_names = copy(given_names)
    _surnames = copy(surnames)
    memo = []

    for _ in range(length):
        shuffle(_given_names)
        shuffle(_surnames)
        memo.append((_given_names[0], _surnames[0]))

    return memo


def main(argv, given_names, surnames):
    start_time = timeit.default_timer()
    description = __doc__
    formatter_class = argparse.RawDescriptionHelpFormatter
    parser = argparse.ArgumentParser(
        description=description, formatter_class=formatter_class
    )

    parser.add_argument("-l", "--length", default=10, type=int)

    args = parser.parse_args(argv)
    length = args.length
    names = generate_names(given_names, surnames, length)

    for given_name, surname in names:
        print(f"{given_name} {surname}")

    time_elapsed = timeit.default_timer() - start_time
    print(f"\nReturned {length} results in {time_elapsed:.4f} seconds!")


if __name__ == "__main__":
    argv = sys.argv[1:]
    sys.exit(main(argv, given_names, surnames))
