package thb.jeanluc.adventure.command.impl;

import org.junit.jupiter.api.Test;
import thb.jeanluc.adventure.game.GameContext;
import thb.jeanluc.adventure.io.TestIO;
import thb.jeanluc.adventure.model.Condition;
import thb.jeanluc.adventure.model.Effect;
import thb.jeanluc.adventure.model.Npc;
import thb.jeanluc.adventure.model.NpcReaction;
import thb.jeanluc.adventure.model.Player;
import thb.jeanluc.adventure.model.Room;
import thb.jeanluc.adventure.model.item.PlainItem;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;

class ReactionEffectsTest {
    @Test
    void reactionRequiresFlagAndAppliesEffects() {
        Room room = new Room("k", "K", "d");
        Npc man = Npc.shell("man", "Old Man", "stooped", "hi");
        man.putReaction("fuse", NpcReaction.builder()
                .requires(List.of(new Condition(Condition.Type.FLAG, "cellar_drained")))
                .effects(List.of(new Effect(Effect.Type.SET_FLAG, "fuse_installed")))
                .response("Done.")
                .build());
        room.addNpc(man);
        Player player = new Player(room, 0);
        player.addItem(PlainItem.builder().id("fuse").name("Fuse").description("d").build());
        TestIO io = new TestIO();
        GameContext ctx = new GameContext(null, player, io);

        new GiveCommand().execute(ctx, List.of("fuse", "man"));
        assertThat(ctx.getState().isSet("fuse_installed")).isFalse(); // requires not met

        ctx.getState().set("cellar_drained");
        new GiveCommand().execute(ctx, List.of("fuse", "man"));
        assertThat(ctx.getState().isSet("fuse_installed")).isTrue();
        assertThat(io.allOutput()).contains("Done.");
    }
}
