from datetime import datetime
from enum import StrEnum
from typing import Literal

from pydantic import BaseModel, Field


class CardName(StrEnum):  # Create with a metaclass
    ABANDONEDMINE = "abandonedmine"
    ACOLYTE = "acolyte"
    ACTINGTROUPE = "actingtroupe"
    ACTION_TOKEN = "action_token"
    ADVENTURER = "adventurer"
    ADVISOR = "advisor"
    ALCHEMIST = "alchemist"
    ALLY_ARCHITECTSGUILD = "ally_architectsguild"
    ALLY_BANDOFNOMADS = "ally_bandofnomads"
    ALLY_CAVEDWELLERS = "ally_cavedwellers"
    ALLY_CIRCLEOFWITCHES = "ally_circleofwitches"
    ALLY_CITYSTATE = "ally_citystate"
    ALLY_COASTALHAVEN = "ally_coastalhaven"
    ALLY_CRAFTERSGUILD = "ally_craftersguild"
    ALLY_DESERTGUIDES = "ally_desertguides"
    ALLY_FAMILYOFINVENTORS = "ally_familyofinventors"
    ALLY_FELLOWSHIPOFSCRIBES = "ally_fellowshipofscribes"
    ALLY_FORESTDWELLERS = "ally_forestdwellers"
    ALLY_GANGOFPICKPOCKETS = "ally_gangofpickpockets"
    ALLY_ISLANDFOLK = "ally_islandfolk"
    ALLY_LEAGUEOFBANKERS = "ally_leagueofbankers"
    ALLY_LEAGUEOFSHOPKEEPERS = "ally_leagueofshopkeepers"
    ALLY_MARKETTOWNS = "ally_markettowns"
    ALLY_MOUNTAINFOLK = "ally_mountainfolk"
    ALLY_ORDEROFASTROLOGERS = "ally_orderofastrologers"
    ALLY_ORDEROFMASONS = "ally_orderofmasons"
    ALLY_PEACEFULCULT = "ally_peacefulcult"
    ALLY_PLATEAUSHEPHERDS = "ally_plateaushepherds"
    ALLY_TRAPPERSLODGE = "ally_trapperslodge"
    ALLY_WOODWORKERSGUILD = "ally_woodworkersguild"
    ALTAR = "altar"
    AMBASSADOR = "ambassador"
    AMULET = "amulet"
    ANIMALFAIR = "animalfair"
    ANVIL = "anvil"
    APOTHECARY = "apothecary"
    APPRENTICE = "apprentice"
    ARCHER = "archer"
    ARCHIVE = "archive"
    ARMORY = "armory"
    ARTIFICER = "artificer"
    ARTISAN = "artisan"
    ASTROLABE = "astrolabe"
    AUGURS = "augurs"
    AVANTO = "avanto"
    BADOMENS = "badomens"
    BAGOFGOLD = "bagofgold"
    BAKER = "baker"
    BANDIT = "bandit"
    BANDITCAMP = "banditcamp"
    BANDOFMISFITS = "bandofmisfits"
    BANK = "bank"
    BARBARIAN = "barbarian"
    BARD = "bard"
    BARGE = "barge"
    BARON = "baron"
    BAT = "bat"
    BATTLEPLAN = "battleplan"
    BAUBLE = "bauble"
    BAZAAR = "bazaar"
    BEGGAR = "beggar"
    BERSERKER = "berserker"
    BISHOP = "bishop"
    BLACKCAT = "blackcat"
    BLACKMARKET = "blackmarket"
    BLACKSMITH = "blacksmith"
    BLESSEDVILLAGE = "blessedvillage"
    BLOCKADE = "blockade"
    BOON_THEEARTHSGIFT = "boon_theearthsgift"
    BOON_THEFIELDSGIFT = "boon_thefieldsgift"
    BOON_THEFLAMESGIFT = "boon_theflamesgift"
    BOON_THEFORESTSGIFT = "boon_theforestsgift"
    BOON_THEMOONSGIFT = "boon_themoonsgift"
    BOON_THEMOUNTAINSGIFT = "boon_themountainsgift"
    BOON_THERIVERSGIFT = "boon_theriversgift"
    BOON_THESEASGIFT = "boon_theseasgift"
    BOON_THESKYSGIFT = "boon_theskysgift"
    BOON_THESUNSGIFT = "boon_thesunsgift"
    BOON_THESWAMPSGIFT = "boon_theswampsgift"
    BOON_THEWINDSGIFT = "boon_thewindsgift"
    BORDERGUARD = "borderguard"
    BORDERVILLAGE = "bordervillage"
    BOUNTYHUNTER = "bountyhunter"
    BRIDGE = "bridge"
    BRIDGETROLL = "bridgetroll"
    BROKER = "broker"
    BUREAUCRAT = "bureaucrat"
    BUSTLINGVILLAGE = "bustlingvillage"
    BUTCHER = "butcher"
    BUY_TOKEN = "buy_token"
    CACHE = "cache"
    CAMELTRAIN = "cameltrain"
    CANDLESTICKMAKER = "candlestickmaker"
    CAPITAL = "capital"
    CAPITALCITY = "capitalcity"
    CAPTAIN = "captain"
    CARAVAN = "caravan"
    CARAVANGUARD = "caravanguard"
    CARD_TOKEN = "card_token"
    CARDINAL = "cardinal"
    CARGOSHIP = "cargoship"
    CARPENTER = "carpenter"
    CARTOGRAPHER = "cartographer"
    CASTLES = "castles"
    CATACOMBS = "catacombs"
    CATAPULT = "catapult"
    CATAPULTROCKS = "catapultrocks"
    CAULDRON = "cauldron"
    CAVALRY = "cavalry"
    CELLAR = "cellar"
    CEMETERY = "cemetery"
    CHAMPION = "champion"
    CHANCELLOR = "chancellor"
    CHANGELING = "changeling"
    CHAPEL = "chapel"
    CHARIOTRACE = "chariotrace"
    CHARLATAN = "charlatan"
    CHARM = "charm"
    CHURCH = "church"
    CITY = "city"
    CITYQUARTER = "cityquarter"
    CLASHES = "clashes"
    CLERK = "clerk"
    COBBLER = "cobbler"
    COFFERS_MAT = "coffers_mat"
    COFFERSVILLAGERS_MAT = "coffersvillagers_mat"
    COINOFTHEREALM = "coinoftherealm"
    COINSTOKENS = "coinstokens"
    COLLECTION = "collection"
    COLONY = "colony"
    COLONY_2ND = "colony_2nd"
    CONCLAVE = "conclave"
    CONJURER = "conjurer"
    CONSPIRATOR = "conspirator"
    CONTRABAND = "contraband"
    CONTRACT = "contract"
    COPPER = "copper"
    COPPER2 = "copper2"
    COPPER2_2ND = "copper2_2nd"
    COPPER2ND = "copper2nd"
    COPPERSMITH = "coppersmith"
    CORSAIR = "corsair"
    COUNCILROOM = "councilroom"
    COUNT = "count"
    COUNTERFEIT = "counterfeit"
    COUNTINGHOUSE = "countinghouse"
    COURIER = "courier"
    COURTIER = "courtier"
    COURTYARD = "courtyard"
    COVEN = "coven"
    CROSSROADS = "crossroads"
    CROWN = "crown"
    CRUMBLINGCASTLE = "crumblingcastle"
    CRYPT = "crypt"
    CRYSTALBALL = "crystalball"
    CULTIST = "cultist"
    CURSE = "curse"
    CURSE2 = "curse2"
    CURSE2_2ND = "curse2_2nd"
    CURSE2ND = "curse2nd"
    CURSEDGOLD = "cursedgold"
    CURSEDVILLAGE = "cursedvillage"
    CUTPURSE = "cutpurse"
    DAMEANNA = "dameanna"
    DAMEJOSEPHINE = "damejosephine"
    DAMEMOLLY = "damemolly"
    DAMENATALIE = "damenatalie"
    DAMESYLVIA = "damesylvia"
    DEATHCART = "deathcart"
    DEBTTOKENS = "debttokens"
    DELUDED = "deluded"
    DELUSION = "delusion"
    DENOFSIN = "denofsin"
    DESTRIER = "destrier"
    DEVELOP = "develop"
    DEVILSWORKSHOP = "devilsworkshop"
    DIADEM = "diadem"
    DIPLOMAT = "diplomat"
    DISCIPLE = "disciple"
    DISMANTLE = "dismantle"
    DISPLACE = "displace"
    DISTANTLANDS = "distantlands"
    DISTANTSHORE = "distantshore"
    DOCTOR = "doctor"
    DRUID = "druid"
    DUCAT = "ducat"
    DUCHESS = "duchess"
    DUCHY = "duchy"
    DUCHY2 = "duchy2"
    DUCHY2_2ND = "duchy2_2nd"
    DUCHY2ND = "duchy2nd"
    DUKE = "duke"
    DUNGEON = "dungeon"
    DUPLICATE = "duplicate"
    ELDER = "elder"
    EMBARGO = "embargo"
    EMBARGOTOKENS = "embargotokens"
    EMBASSY = "embassy"
    EMISSARY = "emissary"
    EMPORIUM = "emporium"
    ENCAMPMENT = "encampment"
    ENCAMPMENTPLUNDER = "encampmentplunder"
    ENCHANTRESS = "enchantress"
    ENGINEER = "engineer"
    ENVIOUS = "envious"
    ENVOY = "envoy"
    ENVY = "envy"
    ESTATE = "estate"
    ESTATE2 = "estate2"
    ESTATE2_2ND = "estate2_2nd"
    ESTATE2ND = "estate2nd"
    ESTATE_TOKEN = "estate_token"
    EVENT_ADVANCE = "event_advance"
    EVENT_ALLIANCE = "event_alliance"
    EVENT_ALMS = "event_alms"
    EVENT_ANNEX = "event_annex"
    EVENT_BALL = "event_ball"
    EVENT_BANISH = "event_banish"
    EVENT_BANQUET = "event_banquet"
    EVENT_BARGAIN = "event_bargain"
    EVENT_BONFIRE = "event_bonfire"
    EVENT_BORROW = "event_borrow"
    EVENT_COMMERCE = "event_commerce"
    EVENT_CONQUEST = "event_conquest"
    EVENT_DELAY = "event_delay"
    EVENT_DELVE = "event_delve"
    EVENT_DEMAND = "event_demand"
    EVENT_DESPERATION = "event_desperation"
    EVENT_DOMINATE = "event_dominate"
    EVENT_DONATE = "event_donate"
    EVENT_ENCLAVE = "event_enclave"
    EVENT_ENHANCE = "event_enhance"
    EVENT_EXPEDITION = "event_expedition"
    EVENT_FERRY = "event_ferry"
    EVENT_GAMBLE = "event_gamble"
    EVENT_INHERITANCE = "event_inheritance"
    EVENT_INVEST = "event_invest"
    EVENT_LOSTARTS = "event_lostarts"
    EVENT_MARCH = "event_march"
    EVENT_MISSION = "event_mission"
    EVENT_PATHFINDING = "event_pathfinding"
    EVENT_PILGRIMAGE = "event_pilgrimage"
    EVENT_PLAN = "event_plan"
    EVENT_POPULATE = "event_populate"
    EVENT_PURSUE = "event_pursue"
    EVENT_QUEST = "event_quest"
    EVENT_RAID = "event_raid"
    EVENT_REAP = "event_reap"
    EVENT_RIDE = "event_ride"
    EVENT_RITUAL = "event_ritual"
    EVENT_SALTTHEEARTH = "event_salttheearth"
    EVENT_SAVE = "event_save"
    EVENT_SCOUTINGPARTY = "event_scoutingparty"
    EVENT_SEAWAY = "event_seaway"
    EVENT_SEIZETHEDAY = "event_seizetheday"
    EVENT_STAMPEDE = "event_stampede"
    EVENT_SUMMON = "event_summon"
    EVENT_TAX = "event_tax"
    EVENT_TOIL = "event_toil"
    EVENT_TRADE = "event_trade"
    EVENT_TRAINING = "event_training"
    EVENT_TRANSPORT = "event_transport"
    EVENT_TRAVELLINGFAIR = "event_travellingfair"
    EVENT_TRIUMPH = "event_triumph"
    EVENT_WEDDING = "event_wedding"
    EVENT_WINDFALL = "event_windfall"
    EXILE_MAT = "exile_mat"
    EXORCIST = "exorcist"
    EXPAND = "expand"
    EXPERIMENT = "experiment"
    EXPLORER = "explorer"
    FAIRGROUNDS = "fairgrounds"
    FAITHFULHOUND = "faithfulhound"
    FALCONER = "falconer"
    FAMILIAR = "familiar"
    FAMINE = "famine"
    FARMERSMARKET = "farmersmarket"
    FARMINGVILLAGE = "farmingvillage"
    FARMLAND = "farmland"
    FEAR = "fear"
    FEAST = "feast"
    FEODUM = "feodum"
    FESTIVAL = "festival"
    FISHERMAN = "fisherman"
    FISHINGVILLAGE = "fishingvillage"
    FLAG = "flag"
    FLAGBEARER = "flagbearer"
    FOLLOWERS = "followers"
    FOOL = "fool"
    FOOLSGOLD = "foolsgold"
    FORAGER = "forager"
    FORGE = "forge"
    FORTRESS = "fortress"
    FORTS = "forts"
    FORTUNE = "fortune"
    FORTUNETELLER = "fortuneteller"
    FORUM = "forum"
    FUGITIVE = "fugitive"
    GALLERIA = "galleria"
    GARDENS = "gardens"
    GARRISON = "garrison"
    GATEKEEPER = "gatekeeper"
    GEAR = "gear"
    GHOST = "ghost"
    GHOSTSHIP = "ghostship"
    GHOSTTOWN = "ghosttown"
    GIANT = "giant"
    GLADIATOR = "gladiator"
    GLADIATORFORTUNE = "gladiatorfortune"
    GOAT = "goat"
    GOATHERD = "goatherd"
    GOLD = "gold"
    GOLD2 = "gold2"
    GOLD2_2ND = "gold2_2nd"
    GOLD2ND = "gold2nd"
    GOLEM = "golem"
    GOONS = "goons"
    GOVERNOR = "governor"
    GRANDCASTLE = "grandcastle"
    GRANDMARKET = "grandmarket"
    GRAVEROBBER = "graverobber"
    GREATHALL = "greathall"
    GREED = "greed"
    GROOM = "groom"
    GROUNDSKEEPER = "groundskeeper"
    GUARDDOG = "guarddog"
    GUARDIAN = "guardian"
    GUIDE = "guide"
    GUILDMASTER = "guildmaster"
    HAGGLER = "haggler"
    HAMLET = "hamlet"
    HARBINGER = "harbinger"
    HAREM = "harem"
    HARVEST = "harvest"
    HAUNTEDCASTLE = "hauntedcastle"
    HAUNTEDMIRROR = "hauntedmirror"
    HAUNTEDWOODS = "hauntedwoods"
    HAUNTING = "haunting"
    HAVEN = "haven"
    HERALD = "herald"
    HERBALIST = "herbalist"
    HERBGATHERER = "herbgatherer"
    HERMIT = "hermit"
    HERO = "hero"
    HIDEOUT = "hideout"
    HIGHWAY = "highway"
    HIGHWAYMAN = "highwayman"
    HILLFORT = "hillfort"
    HIRELING = "hireling"
    HOARD = "hoard"
    HORN = "horn"
    HORNOFPLENTY = "hornofplenty"
    HORSE = "horse"
    HORSETRADERS = "horsetraders"
    HOSTELRY = "hostelry"
    HOVEL = "hovel"
    HUMBLECASTLE = "humblecastle"
    HUNTER = "hunter"
    HUNTINGGROUNDS = "huntinggrounds"
    HUNTINGLODGE = "huntinglodge"
    HUNTINGPARTY = "huntingparty"
    IDOL = "idol"
    ILLGOTTENGAINS = "illgottengains"
    IMP = "imp"
    IMPORTER = "importer"
    IMPROVE = "improve"
    INN = "inn"
    INNKEEPER = "innkeeper"
    INVENTOR = "inventor"
    INVESTMENT = "investment"
    IRONMONGER = "ironmonger"
    IRONWORKS = "ironworks"
    ISLAND = "island"
    ISLAND_MAT = "island_mat"
    JACKOFALLTRADES = "jackofalltrades"
    JESTER = "jester"
    JOURNEY_TOKEN = "journey_token"
    JOURNEYMAN = "journeyman"
    JUNKDEALER = "junkdealer"
    KEY = "key"
    KILN = "kiln"
    KINGSCASTLE = "kingscastle"
    KINGSCOURT = "kingscourt"
    KNIGHTS = "knights"
    LABORATORY = "laboratory"
    LACKEYS = "lackeys"
    LANDMARK_AQUEDUCT = "landmark_aqueduct"
    LANDMARK_ARENA = "landmark_arena"
    LANDMARK_BANDITFORT = "landmark_banditfort"
    LANDMARK_BASILICA = "landmark_basilica"
    LANDMARK_BATHS = "landmark_baths"
    LANDMARK_BATTLEFIELD = "landmark_battlefield"
    LANDMARK_COLONNADE = "landmark_colonnade"
    LANDMARK_DEFILEDSHRINE = "landmark_defiledshrine"
    LANDMARK_FOUNTAIN = "landmark_fountain"
    LANDMARK_KEEP = "landmark_keep"
    LANDMARK_LABYRINTH = "landmark_labyrinth"
    LANDMARK_MOUNTAINPASS = "landmark_mountainpass"
    LANDMARK_MUSEUM = "landmark_museum"
    LANDMARK_OBELISK = "landmark_obelisk"
    LANDMARK_ORCHARD = "landmark_orchard"
    LANDMARK_PALACE = "landmark_palace"
    LANDMARK_TOMB = "landmark_tomb"
    LANDMARK_TOWER = "landmark_tower"
    LANDMARK_TRIUMPHALARCH = "landmark_triumphalarch"
    LANDMARK_WALL = "landmark_wall"
    LANDMARK_WOLFDEN = "landmark_wolfden"
    LANTERN = "lantern"
    LEGIONARY = "legionary"
    LEPRECHAUN = "leprechaun"
    LIBRARY = "library"
    LICH = "lich"
    LIGHTHOUSE = "lighthouse"
    LIVERY = "livery"
    LOAN = "loan"
    LOCUSTS = "locusts"
    LOOKOUT = "lookout"
    LOSTCITY = "lostcity"
    LOSTINTHEWOODS = "lostinthewoods"
    LUCKYCOIN = "luckycoin"
    LURKER = "lurker"
    MADMAN = "madman"
    MAGICLAMP = "magiclamp"
    MAGNATE = "magnate"
    MAGPIE = "magpie"
    MANDARIN = "mandarin"
    MARAUDER = "marauder"
    MARGRAVE = "margrave"
    MARKET = "market"
    MARKETSQUARE = "marketsquare"
    MARQUIS = "marquis"
    MASQUERADE = "masquerade"
    MASTERMIND = "mastermind"
    MASTERPIECE = "masterpiece"
    MENAGERIE = "menagerie"
    MERCENARY = "mercenary"
    MERCHANT = "merchant"
    MERCHANTCAMP = "merchantcamp"
    MERCHANTGUILD = "merchantguild"
    MERCHANTSHIP = "merchantship"
    MESSENGER = "messenger"
    MILITIA = "militia"
    MILL = "mill"
    MILLER = "miller"
    MINE = "mine"
    MININGVILLAGE = "miningvillage"
    MINION = "minion"
    MINT = "mint"
    MINUSCARD_TOKEN = "minuscard_token"
    MINUSCOIN_TOKEN = "minuscoin_token"
    MINUSCOST_TOKEN = "minuscost_token"
    MISER = "miser"
    MISERABLE = "miserable"
    MISERY = "misery"
    MOAT = "moat"
    MODIFY = "modify"
    MONASTERY = "monastery"
    MONEYLENDER = "moneylender"
    MONKEY = "monkey"
    MONUMENT = "monument"
    MOUNTAINVILLAGE = "mountainvillage"
    MOUNTEBANK = "mountebank"
    MYSTIC = "mystic"
    NATIVE_VILLAGE_MAT = "native_village_mat"
    NATIVEVILLAGE = "nativevillage"
    NAVIGATOR = "navigator"
    NECROMANCER = "necromancer"
    NECROPOLIS = "necropolis"
    NIGHTWATCHMAN = "nightwatchman"
    NOBLEBRIGAND = "noblebrigand"
    NOBLES = "nobles"
    NOMADCAMP = "nomadcamp"
    NOMADS = "nomads"
    OASIS = "oasis"
    ODYSSEYS = "odysseys"
    OLDMAP = "oldmap"
    OLDWITCH = "oldwitch"
    OPULENTCASTLE = "opulentcastle"
    ORACLE = "oracle"
    OUTPOST = "outpost"
    OVERGROWNESTATE = "overgrownestate"
    OVERLORD = "overlord"
    PADDOCK = "paddock"
    PAGE = "page"
    PASTURE = "pasture"
    PATRICIAN = "patrician"
    PATRICIANEMPORIUM = "patricianemporium"
    PATROL = "patrol"
    PATRON = "patron"
    PAWN = "pawn"
    PEARLDIVER = "pearldiver"
    PEASANT = "peasant"
    PEDDLER = "peddler"
    PHILOSOPHERSSTONE = "philosophersstone"
    PILLAGE = "pillage"
    PIRATE = "pirate"
    PIRATE_SHIP_MAT = "pirate_ship_mat"
    PIRATESHIP = "pirateship"
    PIXIE = "pixie"
    PLAGUE = "plague"
    PLATINUM = "platinum"
    PLATINUM_2ND = "platinum_2nd"
    PLAZA = "plaza"
    PLUNDER = "plunder"
    PLUSCOIN_TOKEN = "pluscoin_token"
    POACHER = "poacher"
    POOKA = "pooka"
    POORHOUSE = "poorhouse"
    PORT = "port"
    POSSESSION = "possession"
    POTION = "potion"
    POTION_2ND = "potion_2nd"
    POUCH = "pouch"
    POVERTY = "poverty"
    PRIEST = "priest"
    PRINCE = "prince"
    PRINCESS = "princess"
    PROCESSION = "procession"
    PROJECT_ACADEMY = "project_academy"
    PROJECT_BARRACKS = "project_barracks"
    PROJECT_CANAL = "project_canal"
    PROJECT_CAPITALISM = "project_capitalism"
    PROJECT_CATHEDRAL = "project_cathedral"
    PROJECT_CITADEL = "project_citadel"
    PROJECT_CITYGATE = "project_citygate"
    PROJECT_CROPROTATION = "project_croprotation"
    PROJECT_EXPLORATION = "project_exploration"
    PROJECT_FAIR = "project_fair"
    PROJECT_FLEET = "project_fleet"
    PROJECT_GUILDHALL = "project_guildhall"
    PROJECT_INNOVATION = "project_innovation"
    PROJECT_PAGEANT = "project_pageant"
    PROJECT_PIAZZA = "project_piazza"
    PROJECT_ROADNETWORK = "project_roadnetwork"
    PROJECT_SEWERS = "project_sewers"
    PROJECT_SILOS = "project_silos"
    PROJECT_SINISTERPLOT = "project_sinisterplot"
    PROJECT_STARCHART = "project_starchart"
    PROVINCE = "province"
    PROVINCE2 = "province2"
    PROVINCE2_2ND = "province2_2nd"
    PROVINCE2ND = "province2nd"
    QUARRY = "quarry"
    RABBLE = "rabble"
    RAIDER = "raider"
    RANGER = "ranger"
    RATCATCHER = "ratcatcher"
    RATS = "rats"
    RAZE = "raze"
    REBUILD = "rebuild"
    RECRUITER = "recruiter"
    RELIC = "relic"
    REMAKE = "remake"
    REMODEL = "remodel"
    REPLACE = "replace"
    RESEARCH = "research"
    ROCKS = "rocks"
    ROGUE = "rogue"
    ROYALBLACKSMITH = "royalblacksmith"
    ROYALCARRIAGE = "royalcarriage"
    ROYALGALLEY = "royalgalley"
    ROYALSEAL = "royalseal"
    RUINEDLIBRARY = "ruinedlibrary"
    RUINEDMARKET = "ruinedmarket"
    RUINEDVILLAGE = "ruinedvillage"
    SABOTEUR = "saboteur"
    SACREDGROVE = "sacredgrove"
    SACRIFICE = "sacrifice"
    SAGE = "sage"
    SAILOR = "sailor"
    SALVAGER = "salvager"
    SANCTUARY = "sanctuary"
    SAUNA = "sauna"
    SAUNAAVANTO = "saunaavanto"
    SCAVENGER = "scavenger"
    SCEPTER = "scepter"
    SCHEME = "scheme"
    SCHOLAR = "scholar"
    SCOUT = "scout"
    SCRAP = "scrap"
    SCRYINGPOOL = "scryingpool"
    SCULPTOR = "sculptor"
    SEACHART = "seachart"
    SEAHAG = "seahag"
    SEAWITCH = "seawitch"
    SECRETCAVE = "secretcave"
    SECRETCHAMBER = "secretchamber"
    SECRETPASSAGE = "secretpassage"
    SEER = "seer"
    SENTINEL = "sentinel"
    SENTRY = "sentry"
    SETTLERS = "settlers"
    SETTLERSBUSTLINGVILLAGE = "settlersbustlingvillage"
    SHANTYTOWN = "shantytown"
    SHEEPDOG = "sheepdog"
    SHEPHERD = "shepherd"
    SIBYL = "sibyl"
    SILKMERCHANT = "silkmerchant"
    SILKROAD = "silkroad"
    SILVER = "silver"
    SILVER2 = "silver2"
    SILVER2_2ND = "silver2_2nd"
    SILVER2ND = "silver2nd"
    SIRBAILEY = "sirbailey"
    SIRDESTRY = "sirdestry"
    SIRMARTIN = "sirmartin"
    SIRMICHAEL = "sirmichael"
    SIRVANDER = "sirvander"
    SKIRMISHER = "skirmisher"
    SKULK = "skulk"
    SLEIGH = "sleigh"
    SMALLCASTLE = "smallcastle"
    SMITHY = "smithy"
    SMUGGLERS = "smugglers"
    SNOWYVILLAGE = "snowyvillage"
    SOLDIER = "soldier"
    SOOTHSAYER = "soothsayer"
    SORCERER = "sorcerer"
    SORCERESS = "sorceress"
    SOUK = "souk"
    SPECIALIST = "specialist"
    SPICEMERCHANT = "spicemerchant"
    SPICES = "spices"
    SPOILS = "spoils"
    SPRAWLINGCASTLE = "sprawlingcastle"
    SPY = "spy"
    SQUIRE = "squire"
    STABLES = "stables"
    STASH = "stash"
    STEWARD = "steward"
    STOCKPILE = "stockpile"
    STONEMASON = "stonemason"
    STOREROOM = "storeroom"
    STORYTELLER = "storyteller"
    STRONGHOLD = "stronghold"
    STUDENT = "student"
    SUNKENTREASURE = "sunkentreasure"
    SUPPLIES = "supplies"
    SURVIVORS = "survivors"
    SWAMPHAG = "swamphag"
    SWAP = "swap"
    SWASHBUCKLER = "swashbuckler"
    SWINDLER = "swindler"
    SYCOPHANT = "sycophant"
    TACTICIAN = "tactician"
    TALISMAN = "talisman"
    TAVERN_MAT = "tavern_mat"
    TAXMAN = "taxman"
    TEACHER = "teacher"
    TEMPLE = "temple"
    TENT = "tent"
    TERRITORY = "territory"
    THIEF = "thief"
    THRONEROOM = "throneroom"
    TIARA = "tiara"
    TIDEPOOLS = "tidepools"
    TORMENTOR = "tormentor"
    TORTURER = "torturer"
    TOURNAMENT = "tournament"
    TOWN = "town"
    TOWNCRIER = "towncrier"
    TOWNSFOLK = "townsfolk"
    TRACKER = "tracker"
    TRADE_ROUTE_MAT = "trade_route_mat"
    TRADER = "trader"
    TRADEROUTE = "traderoute"
    TRADINGPOST = "tradingpost"
    TRAGICHERO = "tragichero"
    TRAIL = "trail"
    TRANSMOGRIFY = "transmogrify"
    TRANSMUTE = "transmute"
    TRASHING_TOKEN = "trashing_token"
    TREASURECHEST = "treasurechest"
    TREASUREHUNTER = "treasurehunter"
    TREASUREMAP = "treasuremap"
    TREASURER = "treasurer"
    TREASURETROVE = "treasuretrove"
    TREASURY = "treasury"
    TRIBUTE = "tribute"
    TRUSTYSTEED = "trustysteed"
    TUNNEL = "tunnel"
    TWICEMISERABLE = "twicemiserable"
    UNDERLING = "underling"
    UNIVERSITY = "university"
    UPGRADE = "upgrade"
    URCHIN = "urchin"
    VAGRANT = "vagrant"
    VAMPIRE = "vampire"
    VASSAL = "vassal"
    VAULT = "vault"
    VENTURE = "venture"
    VILLA = "villa"
    VILLAGE = "village"
    VILLAGEGREEN = "villagegreen"
    VILLAIN = "villain"
    VINEYARD = "vineyard"
    VOYAGE = "voyage"
    VP_MAT_1 = "vp_mat_1"
    VP_MAT_2 = "vp_mat_2"
    VP_MAT_3 = "vp_mat_3"
    VP_MAT_4 = "vp_mat_4"
    VP_MAT_5 = "vp_mat_5"
    VP_MAT_6 = "vp_mat_6"
    VP_MAT_7 = "vp_mat_7"
    VP_MAT_8 = "vp_mat_8"
    VPTOKENS = "vptokens"
    WALLEDVILLAGE = "walledvillage"
    WANDERINGMINSTREL = "wanderingminstrel"
    WAR = "war"
    WARCHEST = "warchest"
    WAREHOUSE = "warehouse"
    WARLORD = "warlord"
    WARRIOR = "warrior"
    WATCHTOWER = "watchtower"
    WAY_WAYOFTHEBUTTERFLY = "way_wayofthebutterfly"
    WAY_WAYOFTHECAMEL = "way_wayofthecamel"
    WAY_WAYOFTHECHAMELEON = "way_wayofthechameleon"
    WAY_WAYOFTHEFROG = "way_wayofthefrog"
    WAY_WAYOFTHEGOAT = "way_wayofthegoat"
    WAY_WAYOFTHEHORSE = "way_wayofthehorse"
    WAY_WAYOFTHEMOLE = "way_wayofthemole"
    WAY_WAYOFTHEMONKEY = "way_wayofthemonkey"
    WAY_WAYOFTHEMOUSE = "way_wayofthemouse"
    WAY_WAYOFTHEMULE = "way_wayofthemule"
    WAY_WAYOFTHEOTTER = "way_wayoftheotter"
    WAY_WAYOFTHEOWL = "way_wayoftheowl"
    WAY_WAYOFTHEOX = "way_wayoftheox"
    WAY_WAYOFTHEPIG = "way_wayofthepig"
    WAY_WAYOFTHERAT = "way_wayoftherat"
    WAY_WAYOFTHESEAL = "way_wayoftheseal"
    WAY_WAYOFTHESHEEP = "way_wayofthesheep"
    WAY_WAYOFTHESQUIRREL = "way_wayofthesquirrel"
    WAY_WAYOFTHETURTLE = "way_wayoftheturtle"
    WAY_WAYOFTHEWORM = "way_wayoftheworm"
    WAYFARER = "wayfarer"
    WEAVER = "weaver"
    WEREWOLF = "werewolf"
    WHARF = "wharf"
    WHEELWRIGHT = "wheelwright"
    WILDHUNT = "wildhunt"
    WILLOWISP = "willowisp"
    WINEMERCHANT = "winemerchant"
    WISH = "wish"
    WISHINGWELL = "wishingwell"
    WITCH = "witch"
    WITCHSHUT = "witchshut"
    WIZARDS = "wizards"
    WOODCUTTER = "woodcutter"
    WORKERSVILLAGE = "workersvillage"
    WORKSHOP = "workshop"
    YOUNGWITCH = "youngwitch"
    ZOMBIEAPPRENTICE = "zombieapprentice"
    ZOMBIEMASON = "zombiemason"
    ZOMBIESPY = "zombiespy"
    NONE = "NONE"

    def __repr__(self) -> str:
        return self.value.title()


class Cards(BaseModel):
    quantities: dict[CardName, int] = Field(default_factory=dict)


class Player(BaseModel):
    name: str
    hand: Cards | None
    score: int


class Game(BaseModel):
    finished: bool
    players: list[Player]
    stock: Cards


class ActionRecord(BaseModel):
    action: str
    player: Player
    score: int


class ErrorRecord(BaseModel):
    error: str
    player: Player
    type: Literal["error", "warning"] = "error"


class CardNameAndHand(BaseModel):
    card_name: CardName
    hand: list[CardName]


class Hand(BaseModel):
    hand: list[CardName]


class PossibleCards(BaseModel):
    possible_cards: list[CardName]


class MoneyCardsInHand(BaseModel):
    money_in_hand: list[CardName]


HookCallArgs = CardNameAndHand | Hand | PossibleCards | MoneyCardsInHand | None
HookCallResult = CardName | bool | None


class HookCallRecord(BaseModel):
    name: str
    player: Player
    args: HookCallArgs


class HookResultRecord(BaseModel):
    player: Player
    result: HookCallResult


class PlayerTurnRecord(BaseModel):
    actions: list[ActionRecord | ErrorRecord | HookCallRecord | HookResultRecord] = (
        Field(default_factory=list)
    )


class GameRecord(BaseModel):
    date: datetime
    stock: Cards
    turns: list[PlayerTurnRecord] = Field(default_factory=list)
    scores: dict[str, int] = Field(default_factory=dict)
