import typing
from Options import Option, DefaultOnToggle, Range, Toggle, DeathLink, Choice


class EnableCoinStars(DefaultOnToggle):
    """Disable to Ignore 100 Coin Stars. You can still collect them, but they don't do anything"""
    display_name = "Enable 100 Coin Stars"


class StrictCapRequirements(DefaultOnToggle):
    """If disabled, Stars that expect special caps may have to be acquired without the caps"""
    display_name = "Strict Cap Requirements"


class StrictCannonRequirements(DefaultOnToggle):
    """If disabled, Stars that expect cannons may have to be acquired without them. Only makes a difference if Buddy
    Checks are enabled"""
    display_name = "Strict Cannon Requirements"


class FirstBowserStarDoorCost(Range):
    """How many stars are required at the Star Door to Bowser in the Dark World"""
    range_start = 0
    range_end = 50
    default = 8


class BasementStarDoorCost(Range):
    """How many stars are required at the Star Door in the Basement"""
    range_start = 0
    range_end = 70
    default = 30


class SecondFloorStarDoorCost(Range):
    """How many stars are required to access the third floor"""
    range_start = 0
    range_end = 90
    default = 50


class MIPS1Cost(Range):
    """How many stars are required to spawn MIPS the first time"""
    range_start = 0
    range_end = 40
    default = 15


class MIPS2Cost(Range):
    """How many stars are required to spawn MIPS the second time."""
    range_start = 0
    range_end = 80
    default = 50


class StarsToFinish(Range):
    """How many stars are required at the infinite stairs"""
    display_name = "Endless Stairs Stars"
    range_start = 0
    range_end = 100
    default = 70


class AmountOfStars(Range):
    """How many stars exist. Disabling 100 Coin Stars removes 15 from the Pool. At least max of any Cost set"""
    range_start = 35
    range_end = 120
    default = 120


class AreaRandomizer(Choice):
    """Randomize Entrances"""
    display_name = "Entrance Randomizer"
    option_Off = 0
    option_Courses_Only = 1
    option_Courses_and_Secrets_Separate = 2
    option_Courses_and_Secrets = 3


class BuddyChecks(Toggle):
    """Bob-omb Buddies are checks, Cannon Unlocks are items"""
    display_name = "Bob-omb Buddy Checks"


class ExclamationBoxes(Choice):
    """Include 1Up Exclamation Boxes during randomization"""
    display_name = "Randomize 1Up !-Blocks"
    option_Off = 0
    option_1Ups_Only = 1


class ProgressiveKeys(DefaultOnToggle):
    """Keys will first grant you access to the Basement, then to the Secound Floor"""
    display_name = "Progressive Keys"


sm64_options: typing.Dict[str, type(Option)] = {
    "AreaRandomizer": AreaRandomizer,
    "ProgressiveKeys": ProgressiveKeys,
    "EnableCoinStars": EnableCoinStars,
    "AmountOfStars": AmountOfStars,
    "StrictCapRequirements": StrictCapRequirements,
    "StrictCannonRequirements": StrictCannonRequirements,
    "FirstBowserStarDoorCost": FirstBowserStarDoorCost,
    "BasementStarDoorCost": BasementStarDoorCost,
    "SecondFloorStarDoorCost": SecondFloorStarDoorCost,
    "MIPS1Cost": MIPS1Cost,
    "MIPS2Cost": MIPS2Cost,
    "StarsToFinish": StarsToFinish,
    "death_link": DeathLink,
    "BuddyChecks": BuddyChecks,
    "ExclamationBoxes": ExclamationBoxes,
}