"""Tests for the Earth section of the game."""

from tests.conftest import send


def test_start_in_dark(game):
    state, _, _ = game
    assert not state.lit
    text = send(game, "look")
    assert "pitch black" in text.lower()


def test_turn_on_light(game):
    text = send(game, "turn on light")
    assert "Good start" in text
    assert "light is now on" in text
    state, _, _ = game
    assert state.lit


def test_turn_off_light(game):
    send(game, "turn on light")
    text = send(game, "turn off light")
    assert "pitch dark" in text
    state, _, _ = game
    assert not state.lit


def test_get_out_of_bed(game):
    send(game, "turn on light")
    text = send(game, "get out of bed")
    assert "manage it" in text.lower()
    state, _, _ = game
    assert not state.lying_down


def test_cant_walk_while_lying_down(game):
    send(game, "turn on light")
    text = send(game, "south")
    # Player starts in bed, so the message references getting out of bed
    assert "get out" in text.lower() or "get up" in text.lower()


def test_take_gown_with_headache(game):
    send(game, "turn on light")
    send(game, "get out of bed")
    text = send(game, "get gown")
    assert "large enough" in text.lower()
    assert "pocket" in text.lower()


def test_wear_gown(game):
    send(game, "turn on light")
    send(game, "get out of bed")
    send(game, "get gown")
    text = send(game, "wear gown")
    assert "wearing" in text.lower()


def test_look_in_pocket(game):
    send(game, "turn on light")
    send(game, "get out of bed")
    send(game, "get gown")
    send(game, "wear gown")
    text = send(game, "look in pocket")
    # Gown should open and reveal contents
    assert "thing" in text.lower() or "fluff" in text.lower() or "analgesic" in text.lower()


def test_eat_tablet(game):
    send(game, "turn on light")
    send(game, "get out of bed")
    send(game, "get gown")
    send(game, "wear gown")
    send(game, "look in pocket")  # opens gown
    text = send(game, "eat tablet")
    assert "headache goes" in text.lower()
    state, _, _ = game
    assert not state.flags.get("headache")
    assert state.score == 10


def test_cant_leave_bedroom_with_headache(game):
    send(game, "turn on light")
    send(game, "get out of bed")
    send(game, "open door")
    text = send(game, "south")
    assert "eighteen inches" in text.lower() or "jostles" in text.lower()


def test_leave_bedroom_after_tablet(game):
    send(game, "turn on light")
    send(game, "get out of bed")
    send(game, "get gown")
    send(game, "wear gown")
    send(game, "look in pocket")
    send(game, "eat tablet")
    text = send(game, "south")
    # Should successfully leave bedroom
    state, _, _ = game
    assert state.here.id == "FRONT-PORCH"


def test_cant_leave_house_without_gown(game):
    send(game, "turn on light")
    send(game, "get out of bed")
    send(game, "get gown")
    send(game, "wear gown")
    send(game, "look in pocket")
    send(game, "eat tablet")
    send(game, "south")
    # Now at front porch, take off gown
    send(game, "take off gown")
    text = send(game, "south")
    assert "indecency" in text.lower()


def test_leave_house_with_gown(game):
    send(game, "turn on light")
    send(game, "get out of bed")
    send(game, "get gown")
    send(game, "wear gown")
    send(game, "look in pocket")
    send(game, "eat tablet")
    send(game, "south")
    text = send(game, "south")
    state, _, _ = game
    assert state.here.id == "FRONT-OF-HOUSE"


def test_navigate_to_pub(game):
    # Speed through to pub
    send(game, "turn on light")
    send(game, "get out of bed")
    send(game, "get gown")
    send(game, "wear gown")
    send(game, "look in pocket")
    send(game, "eat tablet")
    send(game, "south")  # front porch
    send(game, "south")  # front of house
    send(game, "south")  # country lane
    text = send(game, "south")  # pub
    state, _, _ = game
    assert state.here.id == "PUB"
    # Ford should have arrived
    assert "Ford" in text or state.flags.get("ford_arrived")


def test_drink_three_beers(game):
    # Speed through to pub
    send(game, "turn on light")
    send(game, "get out of bed")
    send(game, "get gown")
    send(game, "wear gown")
    send(game, "look in pocket")
    send(game, "eat tablet")
    send(game, "south")
    send(game, "south")
    send(game, "south")
    send(game, "south")  # pub

    text1 = send(game, "drink beer")
    assert "2 pint" in text1.lower()
    text2 = send(game, "drink beer")
    assert "1 pint" in text2.lower()
    text3 = send(game, "drink beer")
    assert "wriggly" in text3.lower() or "ear" in text3.lower()

    state, _, _ = game
    assert state.score == 25  # 10 (tablet) + 15 (beers)


def test_score_command(game):
    text = send(game, "score")
    assert "0 of a possible 400" in text


def test_inventory_shows_headache(game):
    text = send(game, "inventory")
    assert "splitting headache" in text.lower()


def test_inventory_shows_no_tea(game):
    text = send(game, "inventory")
    assert "no tea" in text.lower()


def test_examine_bed(game):
    send(game, "turn on light")
    text = send(game, "examine bed")
    assert "bed" in text.lower()


def test_look_under_bed(game):
    send(game, "turn on light")
    send(game, "get out of bed")
    text = send(game, "look under bed")
    assert "handkerchiefs" in text.lower() or "nothing" in text.lower()


def test_open_curtains_reveals_bulldozer(game):
    send(game, "turn on light")
    send(game, "get out of bed")
    text = send(game, "open curtains")
    assert "bulldozer" in text.lower()


def test_screwdriver_headache(game):
    """Can't take screwdriver while having a headache."""
    send(game, "turn on light")
    send(game, "get out of bed")
    text = send(game, "take screwdriver")
    assert "dances" in text.lower() or "possessed" in text.lower()


def test_toothbrush_headache(game):
    """Can't take toothbrush while having a headache."""
    send(game, "turn on light")
    send(game, "get out of bed")
    text = send(game, "take toothbrush")
    assert "lunge" in text.lower() or "spins" in text.lower()


def test_phone_action(game):
    send(game, "turn on light")
    send(game, "get out of bed")
    text = send(game, "answer phone")
    assert "receiver" in text.lower() or "dialling" in text.lower()
