/**
 * Shop manager integration tests (real catalog + purchaseItem)
 */
import { describe, it, expect, beforeEach } from 'vitest';
import { Person } from '../../../src/models/Person.js';
import { Player } from '../../../src/models/Player.js';
import {
  getStoreItems,
  purchaseItem,
  resetStoreItemsCacheForTests,
} from '../../../src/services/shop/shop_manager.js';

describe('shop_manager', () => {
  let player: Player;

  beforeEach(() => {
    resetStoreItemsCacheForTests();
    const character = new Person({
      id: 'char-1',
      firstname: 'Test',
      lastname: 'Player',
      ageYears: 25,
      money: 100_000,
      energy: 50,
    });
    player = new Player({
      userId: 'user-1',
      character,
      r: [],
      status: 'playing',
      date: '2024-06-15',
      hourOfDay: 10,
      minuteOfHour: 30,
    });
  });

  it('uses stable ids across getStoreItems() calls', () => {
    const first = getStoreItems();
    const second = getStoreItems();
    expect(first[0].id).toBe(second[0].id);
    expect(first[0].id).toBe('case-of-energy-drinks');
  });

  it('purchaseItem finds catalog id from initial getStoreItems()', () => {
    const catalogId = getStoreItems()[0].id;
    const beforeMoney = player.c.money;

    const result = purchaseItem(player, catalogId);

    expect(result.success).toBe(true);
    expect(player.c.money).toBe(beforeMoney - getStoreItems()[0].price);
    expect(player.c.energy).toBe(50 + 20);
  });

  it('adds permanent items to inventory', () => {
    const sportsCar = getStoreItems().find((i) => i.name === 'Sports Car');
    expect(sportsCar).toBeDefined();

    player.c.money = sportsCar!.price;
    const result = purchaseItem(player, sportsCar!.id);

    expect(result.success).toBe(true);
    expect(player.c.items?.some((i) => i.id === sportsCar!.id)).toBe(true);
  });
});
