import { Person } from '../../src/models/Person.js';
import { Player } from '../../src/models/Player.js';
import { createHabit } from '../../src/services/health/habit_manager.js';
import { getStoreItems } from '../../src/services/shop/shop_manager.js';
import { getExtracurriculars } from '../../src/services/education/index.js';

export class MockPlayerSession {
  player: Player;
  sentMessages: unknown[] = [];
  savePlayerCalled = false;

  constructor(player: Player) {
    this.player = player;
  }

  send(message: unknown) {
    this.sentMessages.push(message);
  }

  sendPlayerObject() {
    this.sentMessages.push({ type: 'playerObject', player: this.player });
  }

  async savePlayer() {
    this.savePlayerCalled = true;
  }

  start() {
    /* no-op for game control handler tests */
  }

  stop() {
    /* no-op for game control handler tests */
  }

  getMessagesByType(type: string): Record<string, unknown>[] {
    return this.sentMessages.filter(
      (m) => (m as { type?: string }).type === type
    ) as Record<string, unknown>[];
  }

  sentErrorMatching(pattern: RegExp): boolean {
    return this.sentMessages.some((m) => {
      const msg = m as { type?: string; message?: string };
      return msg.type === 'error' && pattern.test(msg.message ?? '');
    });
  }
}

export function createTestPlayer(overrides?: Partial<{ ageYears: number; money: number }>): Player {
  const character = new Person({
    id: 'char-1',
    firstname: 'Test',
    lastname: 'Player',
    ageYears: overrides?.ageYears ?? 25,
    money: overrides?.money ?? 1000,
    diamonds: 50,
    energy: 80,
    health: 90,
    happiness: 70,
  });

  return new Player({
    userId: 'user-1',
    character,
    r: [],
    status: 'playing',
    date: '2024-06-15',
    hourOfDay: 10,
    minuteOfHour: 30,
  });
}

export function seedSmokingHabit(player: Player): void {
  player.c.habits = [createHabit('smoking', 'Smoking')];
}

export function seedNpc(player: Player, id = 'npc-1'): void {
  player.r.push(
    new Person({
      id,
      firstname: 'Alex',
      lastname: 'Friend',
      ageYears: 24,
    })
  );
}

export function seedStoreItem(player: Player): string {
  const items = getStoreItems();
  const item = items[0];
  if (item) {
    player.c.money = Math.max(player.c.money ?? 0, (item.price ?? 0) + 100);
    return item.id;
  }
  return 'generic-item';
}

export function seedExtracurricularId(): string {
  const activities = getExtracurriculars();
  return activities[0]?.id ?? 'debate-club';
}
