/**
 * T007b: a shop energy boost must never push energy above the 100 ceiling.
 * Also verifies prestige items now carry a recurring weekly upkeep when bought.
 */
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 energy cap', () => {
  beforeEach(() => {
    resetStoreItemsCacheForTests();
  });

  function makePlayer(energy: number, money = 100_000): Player {
    const character = new Person({
      id: 'char-1',
      firstname: 'Test',
      lastname: 'Player',
      ageYears: 25,
      money,
      energy,
    } as never);
    return new Player({
      userId: 'user-1',
      character,
      r: [],
      status: 'playing',
      date: '2024-06-15',
      hourOfDay: 10,
    } as never);
  }

  it('energy boost cannot exceed 100 (near-max start)', () => {
    const player = makePlayer(95); // +20 boost would be 115 without the cap
    const energyDrink = getStoreItems().find((i) => i.energyBoost > 0)!;
    expect(energyDrink).toBeDefined();

    const result = purchaseItem(player, energyDrink.id);
    expect(result.success).toBe(true);
    expect(player.c.energy).toBe(100);
    expect(player.c.energy).toBeLessThanOrEqual(100);
  });

  it('energy boost from already-full energy stays at 100', () => {
    const player = makePlayer(100);
    const energyDrink = getStoreItems().find((i) => i.energyBoost > 0)!;
    purchaseItem(player, energyDrink.id);
    expect(player.c.energy).toBe(100);
  });

  it('energy boost below the cap still applies normally', () => {
    const player = makePlayer(50);
    const energyDrink = getStoreItems().find((i) => i.energyBoost > 0)!;
    purchaseItem(player, energyDrink.id);
    expect(player.c.energy).toBe(50 + energyDrink.energyBoost);
  });

  it('purchased prestige item carries a recurring weekly upkeep', () => {
    const player = makePlayer(50);
    const car = getStoreItems().find((i) => i.name === 'Sports Car')!;
    expect(car.weeklyUpkeep).toBeGreaterThan(0);

    player.c.money = car.price;
    purchaseItem(player, car.id);

    const owned = player.c.items?.find((i) => i.id === car.id);
    expect(owned).toBeDefined();
    expect(owned?.weeklyUpkeep).toBe(car.weeklyUpkeep);
  });
});
