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

const mocked = vi.hoisted(() => ({
  poolQuery: vi.fn(),
}));

vi.mock('../../db', () => ({
  default: {
    query: mocked.poolQuery,
  },
}));

describe('pick model guards', () => {
  beforeEach(() => {
    vi.clearAllMocks();
  });

  it('returns false instead of querying when userId is not a UUID', async () => {
    const { hasUserPurchasedPick } = await import('../pick');

    await expect(hasUserPurchasedPick('1', 'evt-1', 'fc-1')).resolves.toBe(false);
    expect(mocked.poolQuery).not.toHaveBeenCalled();
  });

  it('queries normally for valid UUID user ids', async () => {
    mocked.poolQuery.mockResolvedValue({ rows: [{ id: 'pick-1' }] });
    const { hasUserPurchasedPick } = await import('../pick');

    await expect(
      hasUserPurchasedPick('11111111-1111-4111-8111-111111111111', 'evt-1', 'fc-1')
    ).resolves.toBe(true);

    expect(mocked.poolQuery).toHaveBeenCalledTimes(1);
  });

  it('upserts picks on user/event to avoid duplicate race rows', async () => {
    mocked.poolQuery.mockResolvedValue({
      rows: [{
        id: 'pick-1',
        user_id: '11111111-1111-4111-8111-111111111111',
        forecast_id: 'forecast-1',
        event_id: 'evt-1',
        was_weatherman: false,
        created_at: '2026-03-29T10:00:00.000Z',
        inserted: true,
      }],
    });
    const { recordPick } = await import('../pick');

    const row = await recordPick({
      userId: '11111111-1111-4111-8111-111111111111',
      forecastId: 'forecast-1',
      eventId: 'evt-1',
      wasRainMan: false,
    });

    expect(row.id).toBe('pick-1');
    expect(row.inserted).toBe(true);
    expect(mocked.poolQuery).toHaveBeenCalledTimes(1);
    expect(String(mocked.poolQuery.mock.calls[0][0])).toContain('ON CONFLICT (user_id, event_id) DO NOTHING');
  });

  it('returns the existing pick when another request already inserted it', async () => {
    mocked.poolQuery.mockResolvedValue({
      rows: [{
        id: 'pick-1',
        user_id: '11111111-1111-4111-8111-111111111111',
        forecast_id: 'forecast-1',
        event_id: 'evt-1',
        was_weatherman: false,
        created_at: '2026-03-29T10:00:00.000Z',
        inserted: false,
      }],
    });
    const { recordPick } = await import('../pick');

    const row = await recordPick({
      userId: '11111111-1111-4111-8111-111111111111',
      forecastId: 'forecast-2',
      eventId: 'evt-1',
      wasRainMan: false,
    });

    expect(row.id).toBe('pick-1');
    expect(row.inserted).toBe(false);
  });
});
