####################################
############# Menu #################
####################################

default summon_show_busy = True
default door_randomobj = renpy.random.Random()

init python:
    def __choice(seq):
        seed = door_randomobj.getstate()
        rv = door_randomobj.choice(seq)
        door_randomobj.setstate(seed)
        return rv

define map_transcript_loc = dict(
    library = "Library",
    room_g = "Gryffindor Dormitory",
    room_s = "Slytherin Dormitory",
    room_r = "Ravenclaw Dormitory",
    room_h = "Hufflepuff Dormitory",
    great_hall = "Great Hall",
    courtyard = "Courtyard",
    forest = "Forest",
    greenhouse = "Greenhouse",
    defense = "D.A.D.A Classroom",
    training_grounds = "Training Grounds",
    Lake = "Lake",
    randomstudent = functools.partial(__choice, (
        "Classroom",
        "Bathroom",
        "Hagrid's Hut",
        "Weasley's Store",
        "Mafkin's Store",
        "Broom Cupboard",
        "Attic")),
    randomsnape = functools.partial(__choice, (
        "Classroom",
        "Boathouse",
        "Bathroom",
        "Snape's Office",
        "Hall",
        "Slytherin Dormitory",
        "Library",
        "Attic",
        "Forest",
        "Lake",
        "Dungeons",
        "Quidditch Cave",
        "Staircase",
        "Behind your door",
        "Room of Doom")),
    randomtonks = functools.partial(__choice, (
        "Classroom",
        "Bathroom",
        "Hall",
        "Gryffindor Dormitory",
        "Slytherin Dormitory",
        "Hufflepuff Dormitory",
        "Ravenclaw Dormitory",
        "Training Grounds",
        "Tonks's Room",
        "Quidditch Pitch",
        "Infirmary",
        "Sex Dungeon",
        "Hospital Wing",
        "Forest",
        "Lake",
        "Greenhouse",
        "Mafkin's Store")),
)

label summon:
    $ gui.in_context("summon_menu")
    jump main_room_menu

label summon_menu(xx=723, yy=90):

    $ renpy.dynamic(
        # Door dictionary
        summon_dict = {
            # the order will be the one in the menu
            "Snape": {"ico": "snape", "flag": states.sna.unlocked, "busy": states.sna.busy, "loc": "randomsnape"},
            "Tonks": {"ico": "tonks", "flag": states.ton.unlocked, "busy": states.ton.busy, "loc": "randomtonks"},
            "Hermione": {"ico": "hermione", "flag": states.her.unlocked, "busy": states.her.busy, "loc": states.her.map_location },
            "Cho": {"ico": "cho", "flag": states.cho.unlocked, "busy": states.cho.busy, "loc": states.cho.map_location},
            "Luna": {"ico": "luna", "flag": states.lun.unlocked, "busy": states.lun.busy, "loc": states.lun.map_location},
            "Astoria": {"ico": "astoria", "flag": states.ast.unlocked, "busy": states.ast.busy, "loc": states.ast.map_location },
            "Susan": {"ico": "susan", "flag": states.sus.unlocked, "busy": states.sus.busy, "loc": states.sus.map_location}
            #"Ginny", "Daphne", "Padma", "Patil", "Myrtle", "Mafkin"
        },
    )

    call screen summon(xx, yy)

    return

label .summon(char):
    $ enable_game_menu()
    $ renpy.jump_out_of_context("summon_"+char.lower())

    return

label .summon_busy(char):
    if game.daytime or char in ["Tonks", "Snape"]:
        nar "[char] is currently busy. Try again later."
    else:
        nar "[char] is currently asleep. Try again tomorrow."

    return

screen summon(xx, yy):
    tag summon
    zorder 15
    modal True

    add "gui_fade"

    if renpy.mobile:
        use close_button_background
    use close_button(key=["summon", "game_menu"])

    fixed:
        pos (xx, yy)
        if settings.get("animations"):
            at gui_animation
        use summon_menu

screen summon_menu():
    tag summon_menu
    modal True
    zorder 15

    window:
        style "empty"
        xysize (207, 454)

        use invisible_button()

        add gui.format("interface/achievements/{}/panel_left.webp")

        vbox:
            pos (6, 384)
            spacing 32

            null
            frame:
                style "empty"
                textbutton "Show Busy:":
                    style gui.theme("overlay_button")
                    xsize 195 ysize 32
                    text_align (0.4, 0.5)
                    text_size 12
                    action ToggleVariable("summon_show_busy", True, False)
                add gui.theme("check_{}").format(str(summon_show_busy).lower()) xalign 0.7 ypos 4

        vbox:
            pos (6, 6)
            $ allbusy = True
            for char, char_dict in summon_dict.items():
                if char_dict["flag"]:
                    if summon_show_busy or not char_dict["busy"]:
                        $ allbusy = False
                        frame:
                            style "empty"
                            xsize 195
                            ysize 50
                            vbox:
                                textbutton char:
                                    style "empty"
                                    xsize 195 ysize 46
                                    hover_background gui.format("interface/achievements/{}/highlight_left_b.webp")
                                    text_xalign 0.6 text_yalign 0.5
                                    text_xanchor 0.5
                                    text_size 20
                                    if not char_dict["busy"]:
                                        action Call("summon_menu.summon", char, from_current=True)
                                    else:
                                        text_color "#8C8C70"
                                        action Call("summon_menu.summon_busy", char, from_current=True)

                                add gui.format("interface/achievements/{}/spacer_left.webp")

                            button:
                                style gui.theme("overlay_button")
                                background gui.format("interface/achievements/{}/iconbox.webp")
                                foreground "interface/achievements/glass_iconbox.webp"
                                xysize (48, 48)
                                add crop_image_zoom("interface/icons/head/"+char_dict["ico"]+".webp", 42, 42, char_dict["busy"]) align (0.5, 0.5)

                            $ loc = map_transcript_loc[char_dict["loc"]]
                            text (loc() if callable(loc) else loc) size 10 xcenter 0.6 yalign 0.9

        if not states.sna.unlocked:
            text "You don't know anyone" size 12 at truecenter
        elif allbusy:
            text "All characters are busy" size 12 at truecenter