import { describe, expect, it } from 'vitest';
import { GameState } from '@rpg/engine';
import { migrateV1toV2, migrateV2toV3, registerStateMigrations, STATE_DATA_VERSION } from '../migrations';

describe('миграции GameStateData', () => {
    it('v1→v2: знакомства переименованы, остальное перенесено, version=2', () => {
        const out = migrateV1toV2({
            version: 1,
            flags: ['metElder', 'quest_bells_taken', 'metTrader'],
            vars: { flowers: 3 }
        });
        expect(out.version).toBe(2);
        expect(out.flags).toEqual(['met_elder', 'quest_bells_taken', 'met_mila']);
        expect(out.vars).toEqual({ flowers: 3 });
    });

    it('v2→v3: флаг evening удалён, остальное перенесено, version=3', () => {
        const out = migrateV2toV3({
            version: 2,
            flags: ['evening', 'quest_bells_done', 'hint_bells'],
            vars: { flowers: 3 }
        });
        expect(out.version).toBe(3);
        expect(out.flags).toEqual(['quest_bells_done', 'hint_bells']);
        expect(out.vars).toEqual({ flowers: 3 });
    });

    it('старый сейв v1 читается state.load с миграцией до текущей версии', () => {
        const s = new GameState();
        registerStateMigrations(s);
        expect(s.dataVersion).toBe(STATE_DATA_VERSION);
        s.load({ version: 1, flags: ['metElder', 'metTrader'], vars: {} });
        expect(s.hasFlag('met_elder')).toBe(true);
        expect(s.hasFlag('met_mila')).toBe(true);
        expect(s.hasFlag('metElder')).toBe(false);
        expect(s.hasFlag('metTrader')).toBe(false);
    });

    it('сейв текущей версии миграций не получает', () => {
        const s = new GameState();
        registerStateMigrations(s);
        s.load({ version: STATE_DATA_VERSION, flags: ['quest_bells_done'], vars: {} });
        expect(s.hasFlag('quest_bells_done')).toBe(true);
        expect(s.allFlags).toEqual(['quest_bells_done']);
        // сериализация — в текущей версии
        expect(s.serialize().version).toBe(STATE_DATA_VERSION);
    });
});