import { beforeEach, describe, expect, it } from 'vitest';
import { Person } from '../../src/models/Person.js';
import { Player } from '../../src/models/Player.js';
import {
  awardDiamonds,
  deductDiamonds,
  getDiamondBalance,
  clearAllDiamonds,
} from '../../src/monetization/diamondEconomy.js';

function createPlayer(userId: string, diamonds: number): Player {
  return new Player({
    userId,
    character: new Person({
      id: `char-${userId}`,
      firstname: 'Test',
      lastname: 'User',
      sex: 'Male',
      diamonds,
      status: 'alive',
    }),
    status: 'playing',
    r: [],
  });
}

describe('diamondEconomy security behavior', () => {
  beforeEach(() => {
    clearAllDiamonds();
  });

  it('awards diamonds directly on the player currency object', () => {
    const player = createPlayer('award-player', 10);

    const success = (awardDiamonds as unknown as (playerObj: Player, reason: string, amount: number) => boolean)(
      player,
      'test_award',
      5
    );

    expect(success).toBe(true);
    expect(player.c.diamonds).toBe(15);
  });

  it('deducts diamonds directly from the player currency object', () => {
    const player = createPlayer('deduct-player', 20);

    const result = (deductDiamonds as unknown as (playerObj: Player, reason: string, amount: number) => {
      success: boolean;
      message: string;
      newBalance?: number;
    })(player, 'test_spend', 7);

    expect(result.success).toBe(true);
    expect(result.newBalance).toBe(13);
    expect(player.c.diamonds).toBe(13);
  });

  it('reads diamond balance from the player object state', () => {
    const player = createPlayer('balance-player', 42);

    const balance = (getDiamondBalance as unknown as (playerObj: Player) => number)(player);

    expect(balance).toBe(42);
  });
});
