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

const poolQuery = vi.fn();
const consoleLog = vi.spyOn(console, 'log').mockImplementation(() => {});

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

describe('rm2-shadow-runner', () => {
  beforeEach(() => {
    vi.clearAllMocks();
    vi.resetModules();
    delete process.env.RM2_SHADOW_ENABLED;
  });

  it('returns without DB writes when RM2_SHADOW_ENABLED is false', async () => {
    process.env.RM2_SHADOW_ENABLED = 'false';
    const { runShadow } = await import('../rm2-shadow-runner');

    const result = await runShadow();

    expect(result).toEqual({
      enabled: false,
      dryRun: false,
      copied: 0,
      skipped: 0,
      failed: 0,
      accuracyCopied: 0,
      perLeague: {},
    });
    expect(poolQuery).not.toHaveBeenCalled();
  });

  it('returns per-league drift summary structure when enabled', async () => {
    process.env.RM2_SHADOW_ENABLED = 'true';
    poolQuery.mockResolvedValue({ rows: [] });
    poolQuery
      .mockResolvedValueOnce({
        rows: [{
          config_json: {
            weights: { nba: { grok: 0.3, piff: 0.4, digimon: 0.3 }, default: { grok: 0.5, piff: 0.3, digimon: 0.2 } },
            signals: ['grok', 'piff', 'digimon'],
            composite_version: 'rm_2.0',
          },
        }],
      })
      .mockResolvedValueOnce({
        rows: [{
          event_id: 'evt-1',
          league: 'nba',
          home_team: 'Lakers',
          away_team: 'Celtics',
          forecast_data: { value_rating: 8 },
          confidence_score: 0.74,
          composite_confidence: 0.7,
          model_signals: {
            compositeConfidence: 0.7,
            stormCategory: 4,
            signals: [{ signalId: 'piff', available: true, score: 0.65, weight: 0.4, rawData: { avgEdge: 5, legCount: 2, topPicks: [] }, metadata: { latencyMs: 12, source: 'db', freshness: '2026-03-27' } }],
            strategyProfile: { league: 'nba', signalWeights: {}, requiredSignals: [], optionalSignals: [], ragQueries: [] },
            ragInsights: [],
            edgeBreakdown: { grok: { score: 0.74, weight: 0.6, contribution: 0.44 }, piff: { score: 0.65, weight: 0.4, contribution: 0.26 } },
            inputQuality: { piff: 'A', dvp: 'B', digimon: 'N/A', odds: 'A', rag: 'A', overall: 'A' },
            compositeVersion: 'rm_2.0',
          },
        }],
      })
      .mockResolvedValueOnce({ rows: [] })
      .mockResolvedValueOnce({ rows: [] });

    const { runShadow } = await import('../rm2-shadow-runner');
    const result = await runShadow();

    expect(result.enabled).toBe(true);
    expect(result.perLeague.nba).toMatchObject({
      count: 1,
      nulls: 0,
      nativeShapes: 1,
    });
    expect(typeof result.perLeague.nba.avgDelta).toBe('number');
    expect(typeof result.perLeague.nba.nullRate).toBe('number');
    expect(consoleLog).toHaveBeenCalledWith(expect.stringContaining('[DRIFT] nba'));
  });
});
