import typing
from dataclasses import dataclass

from Options import TextChoice, Range, Toggle, PerGameCommonOptions


class Character(TextChoice):
    """Enter the internal ID of the character to use.

      if you don't know the exact ID to enter with the mod installed go to
     `Mods -> Archipelago Multi-world -> config` to view a list of installed modded character IDs.

     the downfall characters will only work if you have downfall installed.

     Spire Take the Wheel will have your client pick a random character from the list of all your installed characters
     including custom ones.

     if the chosen character mod is not installed it will default back to 'The Ironclad'
     """
    display_name = "Character"
    option_The_Ironclad = 0
    option_The_Silent = 1
    option_The_Defect = 2
    option_The_Watcher = 3
    option_The_Hermit = 4
    option_The_Slime_Boss = 5
    option_The_Guardian = 6
    option_The_Hexaghost = 7
    option_The_Champ = 8
    option_The_Gremlins = 9
    option_The_Automaton = 10
    option_The_Snecko = 11
    option_spire_take_the_wheel = 12


class Ascension(Range):
    """What Ascension do you wish to play with."""
    display_name = "Ascension"
    range_start = 0
    range_end = 20
    default = 0


class FinalAct(Toggle):
    """Whether you will need to collect the 3 keys and beat the final act to complete the game."""
    display_name = "Final Act"
    option_true = 1
    option_false = 0
    default = 0


class Downfall(Toggle):
    """When Downfall is Installed this will switch the played mode to Downfall"""
    display_name = "Downfall"
    option_true = 1
    option_false = 0
    default = 0


class DeathLink(Range):
    """Percentage of health to lose when a death link is received."""
    display_name = "Death Link %"
    range_start = 0
    range_end = 100
    default = 0


@dataclass
class SpireOptions(PerGameCommonOptions):
    character: Character
    ascension: Ascension
    final_act: FinalAct
    downfall: Downfall
    death_link: DeathLink