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

const {
  mockQueryOne,
  mockGetConnection,
  mockConnection,
} = vi.hoisted(() => {
  const connection = {
    execute: vi.fn().mockResolvedValue(undefined),
    release: vi.fn(),
  };

  return {
    mockQueryOne: vi.fn(),
    mockGetConnection: vi.fn().mockResolvedValue(connection),
    mockConnection: connection,
  };
});

vi.mock('../../src/database/pool.js', () => ({
  getPool: vi.fn(),
  query: vi.fn(),
  queryOne: mockQueryOne,
  execute: vi.fn(),
  getConnection: mockGetConnection,
}));

import { loadPlayer } from '../../src/database/players.js';

describe('legacy Python save migration', () => {
  beforeEach(() => {
    vi.clearAllMocks();
    mockGetConnection.mockResolvedValue(mockConnection);
  });

  it('loads legacy lifesim_savegames JSON when no TypeScript player row exists', async () => {
    mockQueryOne.mockImplementation(async (sql: string) => {
      if (sql.includes('FROM players')) {
        return null;
      }

      if (sql.includes('FROM lifesim_savegames')) {
        return {
          id: 'legacy-user',
          firstname: 'Legacy',
          lastname: 'Player',
          ageYears: 31,
          ageDays: 12,
          lastUpdated: new Date('2026-01-01T00:00:00.000Z'),
          pickle_data: null,
          json: JSON.stringify({
            id: 'legacy-user',
            c: {
              id: 'legacy-character',
              firstname: 'Legacy',
              lastname: 'Player',
              sex: 'Female',
              status: 'alive',
              ageYears: 31,
              ageDays: 12,
            },
            status: 'playing',
            events: ['first_steps'],
            askedQuestions: ['tutorialComplete'],
          }),
        };
      }

      return null;
    });

    const player = await loadPlayer('legacy-user');

    expect(player?.userId).toBe('legacy-user');
    expect(player?.c.firstname).toBe('Legacy');
    expect(player?.c.ageYears).toBe(31);
    expect(player?.events.has('first_steps')).toBe(true);
    expect(player?.askedQuestions.has('tutorialComplete')).toBe(true);
    expect(mockConnection.execute).toHaveBeenCalledWith(
      expect.stringContaining('REPLACE INTO players'),
      expect.arrayContaining(['legacy-user'])
    );
  });
});
