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

import { createEventRegistry } from '../../../src/events/v2/registry.js';
import type { EventDefinition } from '../../../src/events/v2/types.js';
import { EventEngine } from '../../../src/events/v2/engine/EventEngine.js';
import { holidayCatalog } from '../../../src/events/v2/catalog/holidays.js';
import { randomCatalog } from '../../../src/events/v2/catalog/random.js';
import { familyCatalog } from '../../../src/events/v2/catalog/family.js';

describe('events v2 passive and scheduled categories', () => {
  it('marks migrated holiday/random/family passive events as passive definitions', () => {
    const allPassiveCatalog = [...holidayCatalog, ...randomCatalog, ...familyCatalog];
    expect(allPassiveCatalog.length).toBeGreaterThan(0);

    for (const definition of allPassiveCatalog) {
      expect(definition.kind).toBe('passive');
      expect(definition.choices.length).toBeGreaterThan(0);
    }
  });

  it('emits event_resolved for eligible passive events and respects schedule gating', async () => {
    const passiveDefinition: EventDefinition = {
      id: 'holiday_new_year',
      category: 'holidays',
      kind: 'passive',
      prompt: 'Happy New Year!',
      isEligible: (player) => (player.date as string | undefined) === '01-01',
      choices: [
        {
          choiceId: 'acknowledge',
          text: 'Acknowledge',
          resolutionText: 'You welcomed the new year and felt refreshed.',
          effects: {
            stats: { happiness: 10 },
          },
        },
      ],
    };
    const registry = createEventRegistry([passiveDefinition]);
    const store = {
      getPendingEventInstances: vi.fn().mockResolvedValue([]),
      createEventInstance: vi.fn().mockImplementation(async (input) => ({
        instanceId: input.instanceId,
        playerId: input.playerId,
        eventId: input.eventId,
        status: 'pending',
        prompt: input.prompt,
        choices: input.choices,
      })),
      resolveEventInstance: vi.fn().mockResolvedValue(true),
    };

    const engine = new EventEngine(registry, store as never);
    const eligiblePlayer = {
      userId: 'player-1',
      date: '01-01',
      c: { ageYears: 20, happiness: 40 },
    };
    const ineligiblePlayer = {
      userId: 'player-1',
      date: '01-02',
      c: { ageYears: 20, happiness: 40 },
    };

    const resolvedEnvelope = await engine.promptNext(eligiblePlayer as never);
    expect(resolvedEnvelope).toMatchObject({
      type: 'event_resolved',
      eventId: 'holiday_new_year',
      resolutionText: 'You welcomed the new year and felt refreshed.',
    });

    const skippedEnvelope = await engine.promptNext(ineligiblePlayer as never);
    expect(skippedEnvelope).toBeNull();
  });
});
