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

import { deriveCalibratedForecastConfidence } from '../grok';

describe('deriveCalibratedForecastConfidence', () => {
  it('keeps weak market-backed edges below the Cat 2 floor', () => {
    const result = deriveCalibratedForecastConfidence({
      spreadEdge: 0,
      totalEdge: 0,
      valueRating: 3,
      rawConfidence: 0.4,
    });

    expect(result).toBe(0.455);
  });

  it('increases confidence when actual edge and value rating increase', () => {
    const weak = deriveCalibratedForecastConfidence({
      spreadEdge: 0.5,
      totalEdge: 0.5,
      valueRating: 5,
      rawConfidence: 0.6,
    });
    const strong = deriveCalibratedForecastConfidence({
      spreadEdge: 3.5,
      totalEdge: 2.5,
      valueRating: 8,
      rawConfidence: 0.6,
    });

    expect(strong).toBeGreaterThan(weak);
    expect(strong).toBe(0.778);
  });

  it('normalizes raw percentage inputs instead of treating them like 60.0 confidence', () => {
    const decimal = deriveCalibratedForecastConfidence({
      spreadEdge: 2,
      totalEdge: 1,
      valueRating: 7,
      rawConfidence: 0.6,
    });
    const percent = deriveCalibratedForecastConfidence({
      spreadEdge: 2,
      totalEdge: 1,
      valueRating: 7,
      rawConfidence: 60,
    });

    expect(percent).toBe(decimal);
    expect(percent).toBe(0.658);
  });

  it('caps extreme outputs', () => {
    const result = deriveCalibratedForecastConfidence({
      spreadEdge: 12,
      totalEdge: 12,
      valueRating: 10,
      rawConfidence: 0.95,
    });

    expect(result).toBe(0.88);
  });

  it('preserves raw model confidence when market prices are missing', () => {
    const result = deriveCalibratedForecastConfidence({
      spreadEdge: 0,
      totalEdge: 0,
      valueRating: 7,
      rawConfidence: 0.74,
      marketBacked: false,
    });

    expect(result).toBe(0.77);
  });

  it('creates real separation between moderate and strong market-backed edges', () => {
    const moderate = deriveCalibratedForecastConfidence({
      spreadEdge: 1,
      totalEdge: 0.5,
      valueRating: 5,
      rawConfidence: 0.6,
    });
    const strong = deriveCalibratedForecastConfidence({
      spreadEdge: 5,
      totalEdge: 3.5,
      valueRating: 5,
      rawConfidence: 0.6,
    });

    expect(strong).toBeGreaterThan(moderate + 0.15);
    expect(moderate).toBe(0.575);
    expect(strong).toBe(0.835);
  });
});
