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

import { buildFeaturedPlayersFromRows } from '../player-prop-radar';

describe('player-prop-radar', () => {
  it('redacts locked forecast detail from featured props', () => {
    const players = buildFeaturedPlayersFromRows([
      {
        id: 'asset-1',
        player_name: 'Luka Doncic',
        team_id: 'LAL',
        team_side: 'home',
        league: 'nba',
        locked: true,
        forecast_payload: {
          prop: 'Points Over 31.5',
          recommendation: 'over',
          odds: -110,
          line: 31.5,
          market_line_value: 31.5,
          projected_stat_value: 34.2,
          projected_probability: 68,
          stat_type: 'points',
          normalized_stat_type: 'points',
          reasoning: 'Forecast detail should not leak.',
        },
      },
    ]);

    expect(players).toHaveLength(1);
    expect(players[0]).toMatchObject({
      player: 'Luka Doncic',
      signalStrength: null,
      maxVarianceEdgePct: null,
      hasPick: false,
      analysis: null,
    });
    expect(players[0].props[0]).toMatchObject({
      assetId: 'asset-1',
      propType: 'Points',
      propLabel: 'Points Over 31.5',
      locked: true,
      marketLine: null,
      odds: null,
      forecastDirection: null,
      projectedOutcome: null,
      projectedProbability: null,
      marketImpliedProbability: null,
      varianceEdgePct: null,
      varianceSignal: null,
      hasPick: false,
      signalTier: null,
      analysis: null,
    });
  });

  it('marks players without lineup confirmation or explicit certainty as unknown', () => {
    const players = buildFeaturedPlayersFromRows(
      [
        {
          id: 'asset-1',
          player_name: 'Jalen Green',
          team_id: 'HOU',
          team_side: 'away',
          league: 'nba',
          locked: false,
          forecast_payload: {
            prop: 'Points Over 24.5',
            recommendation: 'over',
            odds: -110,
            line: 24.5,
            market_line_value: 24.5,
            projected_stat_value: 27.1,
            projected_probability: 64,
            stat_type: 'points',
            normalized_stat_type: 'points',
          },
        },
      ],
      {
        lineups: {
          homeStatus: 'confirmed',
          awayStatus: 'confirmed',
          homePlayers: [{ name: 'Alperen Sengun' }],
          awayPlayers: [{ name: 'Fred VanVleet' }],
        },
      },
    );

    expect(players).toHaveLength(3);
    expect(players.find((player) => player.player === 'Jalen Green')?.availability).toBe('unknown');
  });

  it('seeds featured players from the lineup even when no prop rows exist', () => {
    const players = buildFeaturedPlayersFromRows(
      [],
      {
        lineups: {
          homeStatus: 'confirmed',
          awayStatus: 'projected',
          homePlayers: [{ name: 'Jayson Tatum' }, { name: 'Jaylen Brown' }],
          awayPlayers: [{ name: 'Jalen Brunson' }],
          homeProjMinutes: {
            'Jayson Tatum': 37,
            'Jaylen Brown': 35,
          },
          awayProjMinutes: {
            'Jalen Brunson': 38,
          },
        },
        homeTeamId: 'BOS',
        awayTeamId: 'NYK',
        limit: 10,
      },
    );

    expect(players).toHaveLength(3);
    expect(players).toEqual([
      expect.objectContaining({
        player: 'Jalen Brunson',
        team: 'NYK',
        teamSide: 'away',
        availability: 'projected',
        projectedMinutes: 38,
        props: [],
      }),
      expect.objectContaining({
        player: 'Jayson Tatum',
        team: 'BOS',
        teamSide: 'home',
        availability: 'confirmed',
        projectedMinutes: 37,
        props: [],
      }),
      expect.objectContaining({
        player: 'Jaylen Brown',
        team: 'BOS',
        teamSide: 'home',
        availability: 'confirmed',
        projectedMinutes: 35,
        props: [],
      }),
    ]);
  });
});
