import { describe, expect, it } from 'vitest';

import { Person } from '../../src/models/Person.js';
import { Player } from '../../src/models/Player.js';
import { handleGenericEvent, handleQuestionEvent } from '../../src/handlers/events.js';
import { randomRelationshipEvents } from '../../src/events/relationships/randomEvents.js';

class MockSession {
  player: Player;
  sent: unknown[] = [];

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

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

  sendPlayerObject(): void {
    this.sent.push({ type: 'playerObject' });
  }
}

function createTestPlayer(): Player {
  const character = new Person({
    id: 'player-char',
    firstname: 'Test',
    lastname: 'Player',
    sex: 'Male',
    ageYears: 22,
    money: 5000,
    diamonds: 50,
    energy: 100,
    happiness: 60,
    social: 60,
  });

  return new Player({
    userId: 'user-1',
    character,
    status: 'playing',
    date: '2026-02-07',
    hourOfDay: 10,
  });
}

describe('events dispatch regressions', () => {
  it('keeps randomRelationshipEvents export object limited to real event handlers', () => {
    expect(Object.keys(randomRelationshipEvents)).toEqual([
      'handleRandomRelationshipEvents',
    ]);
  });

  it('rejects legacy questionEvent payloads without callback data', async () => {
    const session = new MockSession(createTestPlayer());

    await handleQuestionEvent(
      { id: 'legacy_event_id', response: { option: 'Option A' } },
      session as unknown as Parameters<typeof handleQuestionEvent>[1]
    );

    expect(session.sent).toContainEqual(
      expect.objectContaining({
        type: 'event_error',
        code: 'UNSUPPORTED_LEGACY_QUESTION_EVENT',
      })
    );
    expect(session.sent).toContainEqual({ type: 'playerObject' });
  });

  it('rejects generic legacy fallback dispatch', async () => {
    const session = new MockSession(createTestPlayer());

    await handleGenericEvent(
      { type: 'firstCrush', message: { option: 'Option B' } },
      session as unknown as Parameters<typeof handleGenericEvent>[1]
    );

    expect(session.sent).toContainEqual(
      expect.objectContaining({
        type: 'event_error',
        code: 'UNSUPPORTED_LEGACY_COMMAND',
      })
    );
  });
});
