import { describe, expect, it } from 'vitest';
import { GameState, Inventory } from '@rpg/engine';
import { QUESTS, QUEST_FLOWERS, activeStage, inventoryItems, questDialogueFor, questDone, questEffectFor, questLog, questTaken } from '../quests';

const bells = QUESTS[0]!;

describe('квест «Три цветка» — стадии', () => {
    it('до знакомства квест не взят, стадий нет', () => {
        const s = new GameState();
        expect(questTaken(s, bells)).toBe(false);
        expect(questLog(s)).toEqual([]);
    });

    it('после взятия активна стадия сбора; диалог сдачи не готов', () => {
        const s = new GameState();
        s.setFlag('quest_bells_taken');
        expect(questTaken(s, bells)).toBe(true);
        expect(activeStage(s, bells)?.dialogue).toBe('elder_hand_in');
        expect(questDialogueFor(s, 'elder')).toBeNull(); // цветов мало
        expect(questLog(s)).toEqual([
            { done: false, text: `Собрать лунные колокольчики у Серых прудов (0/${QUEST_FLOWERS})` }
        ]);
    });

    it('собрано достаточно — сдача готова', () => {
        const s = new GameState();
        s.setFlag('quest_bells_taken');
        s.setVar('flowers', QUEST_FLOWERS);
        expect(questDialogueFor(s, 'elder')).toBe('elder_hand_in');
        expect(questLog(s)).toEqual([
            { done: false, text: `Собрать лунные колокольчики у Серых прудов (3/3)` }
        ]);
        expect(questDone(s, bells)).toBe(false);
    });

    it('после сдачи — эпилог с Милой и финальная строка', () => {
        const s = new GameState();
        s.setFlag('quest_bells_taken');
        s.setVar('flowers', QUEST_FLOWERS);
        s.setFlag('quest_bells_done');
        expect(questDone(s, bells)).toBe(true);
        expect(questDialogueFor(s, 'trader')).toBe('trader_after');
        expect(questDialogueFor(s, 'elder')).toBeNull(); // Ирвин — обычный repeat
        expect(questLog(s)).toEqual([
            { done: true, text: `Собрать лунные колокольчики у Серых прудов (3/3)` },
            { done: true, text: 'Цветы посажены у тропы. Поляна гудит.' }
        ]);
    });
});

describe('эффекты диалогов', () => {
    it('эффекты берутся из стадий реестра и знакомств', () => {
        expect(questEffectFor('elder_hand_in')).toBe('plant_flowers');
        expect(questEffectFor('trader_first')).toBe('give_cloth');
        expect(questEffectFor('elder_first')).toBeNull();
    });

    it('квест завершён, но эпилог (без doneFlag) остаётся активной стадией', () => {
        const s = new GameState();
        s.setFlag('quest_bells_taken');
        s.setFlag('quest_bells_done');
        expect(questDone(s, bells)).toBe(true);
        expect(activeStage(s, bells)?.npc).toBe('trader');
    });
});

describe('inventoryItems из сумки', () => {
    it('имя + множитель, пусто — заглушка', () => {
        const inv = new Inventory();
        expect(inventoryItems(inv)).toEqual(['— пусто —']);
        inv.add('cloth');
        inv.add('bellflower', 2);
        expect(inventoryItems(inv)).toEqual(['Вощёное полотно', `Лунный колокольчик ×2`]);
    });
});