import type { GameStateData } from '@rpg/engine';
import type { AreaId } from '../data/locations';
import { START_MINUTES } from '../systems/Clock';

/**
 * Формат сейва: область, позиция героя, сериализованное состояние прохождения,
 * сумка и время суток. У старых сейвов нет `version`/`items` — normalizeSave
 * дорастает их.
 */
export const SAVE_VERSION = 4;

/** Откуда герой вошёл в область (для переходов kind 'return'). */
export interface ReturnToData {
    area: AreaId;
    entry: { x: number; y: number };
}

export interface SaveData {
    version: number;
    /** В какой области герой (фолбэк 'meadows' для старых сейвов). */
    area: string;
    pos: { x: number; y: number };
    state: GameStateData;
    /** Содержимое сумки: itemId -> количество. */
    items: Record<string, number>;
    /** Время суток в минутах (v4; нет — старт 8:00). */
    clock?: { minutes: number } | null;
    /** Откуда вошли в область (v3; null/undefined — вход не через переход). */
    returnTo?: ReturnToData | null;
    savedAt: number;
}

/** Дополнить сейв старого формата до текущего (без записи). */
export function normalizeSave(save: SaveData): SaveData {
    if (save.version === SAVE_VERSION) return save;
    // v1/v2: area зовётся location, returnTo ещё нет; v3: clock ещё нет.
    const legacy = save as SaveData & { location?: string };
    return {
        ...save,
        version: SAVE_VERSION,
        area: save.area ?? legacy.location ?? 'meadows',
        returnTo: save.returnTo ?? null,
        items: save.items ?? {},
        clock: save.clock ?? { minutes: START_MINUTES }
    };
}